[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: создание сводной таблицы
Dimasick
Есть таблицы T1, T2,..., Tn (n заранее неизвестно, но не более 100) с полями id, V (в каждой). Как создать таблицу S с полями id, sum, где в поле sum будет находиться сумма значений V из всех таблиц T1, T2,..., Tn (с соответствующим id). Например, id - идентификатор работника, V - его зарплата, в таблице T1 записаны зарплаты за январь, Т2 - а февраль,... и т.д., а нужна сводная таблица, где показано, сколько кто получил за все прошедшие месяцы. Каждый месяц при этом будет добавляться новая таблица Tk и в таблице S при этом должны как-то автоматом пересчитываться суммы.

Я пока вижу один способ - вычислить (sql-запросом из php-файла) количество таблиц (n), в цикле получать значения из каждой таблицы и обновлять потом таблицу S. А можно ли как-то проще?
Valick
Dimasick, честно сказать? Вы не видите нихрена.
Вы так сильно обидели реляционную БД что даже представить себе не можете на сколько.
Нельзя так обращаться с БД, иначе она ответит вам тем же.

1) при работе с БД вообще забудьте что такое циклы, и что они существуют в природе.
Если при работе с БД у вас возникает потребность в цикле, знайте 100% вы что-то делаете неправильно.
2) прочитайте что такое нормализация БД, и выучите три первые нормальные формы.
3) одна сущность - одна таблица (это на первых порах аксиома)

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Чуть конкретизирую то, что сказал Валик:
Цитата (Dimasick @ 17.09.2014 - 00:05)
Есть таблицы T1, T2,..., Tn (n заранее неизвестно, но не более 100) с полями id, V (в каждой).

Вот из этого надо сделать сначала одну таблицу, с полями (id, V, d). Где d - это год и месяц.
Тогда будет всего одна таблица, а "сводная таблица" будет получаться из основной одним запросом.

Всё остальное (куча таблиц, по одной на месяц) - колхоз и извращение. Так что сначала переделай структуру БД и логику приложения, потом можно будет говорить о том, как сделать правильный запрос с суммами.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Dimasick
Valick, честно сказать? Вы за лесом деревья уже и не видите. Не пафоса и патетики ожидает вопрошающий, н помощи по сути. Циклы прекрасно пишутся на php и в цикле чудесно можно обращаться к разным таблицам (равно как и к разным БД).

Valick, sergeiss, вы абсолютно правы в том, что так нарезать таблицы не есть гуд, но, скажу я и снова повторю это "но" - не я создавал эти таблицы и нет у меня возможности их перекраивать, т.к. на их структуре завязана работа множества других скриптов.
Ежели кто вдруг знает, как можно получить таблицу сумм проще, чем в описанном мной методе, с радостью выслушаю.
Valick
Dimasick, пафоса никаого нет, я под коняком



_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Dimasick @ 17.09.2014 - 01:09)
не я создавал эти таблицы и нет у меня возможности их перекраивать,

В таком случае сначала получи список нужных таблиц. Я надеюсь, этот процесс можно автоматизировать, названия таблиц должны как-то соответствовать периодам времени. Затем создай один запрос: вложенный запрос объединяет через UNION все таблицы в одну, а затем, тут же, из них получаешь то, что нужно. Заодно при объединении добавь еще одно поле, которое будет четко идентифицировать, к какому периоду времени относятся данные.

И еще. Если есть возможность, найди того, кто сделал такую структуру данных, и переставь ему руки из задницы к плечам smile.gif
Цитата (Dimasick @ 17.09.2014 - 01:09)
Циклы прекрасно пишутся на php и в цикле чудесно можно обращаться к разным таблицам (равно как и к разным БД).

Если этого можно избежать, то лучше этого избежать. Потому что обращение по циклу к разным таблицам получается по времени достаточно долгим и сильно нагружает БД.
Надо стремиться по возможности делать всё одним запросом. Если не получается, то да, можно и в цикле погонять.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
bestxp
Вообще-то бывают причины когда так денормализуют, но тогда всё равно общая должна оставаться
Valick
Цитата
Вообще-то бывают причины когда так денормализуют

Цитата
n заранее неизвестно, но не более 100

серьёзно?

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (bestxp @ 17.09.2014 - 09:30)
Вообще-то бывают причины когда так денормализуют

Если честно, то не могу представить. Разве что сделать что-то типа "а-ля партиции". Но тогда уж лучше использовать стандартный механизм работы с партициями, чем извращаться с кучей таблиц.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
bestxp
причин много статистика посещений например когда у тебя в таблице овер 1млрд записей и некоторые запросы выполняются более 30 секунд, а работать надо только например с данными за месяц

или "архивация" данных для уменьшения объема бд и в случае необходимости быстрого получения доступа к ним и тд)
sergeiss
Цитата (bestxp @ 17.09.2014 - 11:23)
причин много статистика посещений например когда у тебя в таблице овер 1млрд записей и некоторые запросы выполняются более 30 секунд, а работать надо только например с данными за месяц

или "архивация" данных для уменьшения объема бд и в случае необходимости быстрого получения доступа к ним и тд)

Это всё выполняется партициями.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.