Задавайте вопросы, мы ответим
Вы не зашли.
Предисловие.
Есть 2 таблицы.
В допустим tab1 суммируются данные из 2-х полей типа sum()+sum() as `pole1`
Суть вопроса.
Нужно объединить таблицы tab1 и tab2 по уникальному полю.
Но когда я делаю
Неактивен
Если я правильно понимаю, то вам нужно что-то вроде:
SELECT ... FROM (select sum(`pol1`) as `pol1`,... from`tab1` where ... group by ...) t JOIN `tab2` ON (t.`pol1`=`tab2.`pol1`)
Неактивен
Я так понимаю тут подзапрос нужно писать...я в них не шибко разбираюсь пока что.
Написал что-то...но это корявость еще та.
Отредактированно FDL45 (16.12.2010 09:38:46)
Неактивен
FDL45 написал:
Я так понимаю тут подзапрос нужно писать...я в них не шибко разбираюсь пока что.
Разбираться нужно пробовать на простых примерах
http://sqlinfo.ru/forum/viewtopic.php?pid=20949#p20949
FDL45 написал:
Весь заплет в том, что в одной таблице дата хранится в виде YYYY-MM-DD а во второй В двух разных полях(месяц в одном год в другом). Я моск сломал потому как еще и ORDER BY и WHERE надо будет приплести.
Это вопрос или рассуждение?
Из приведенного запроса не ясно, что вам нужно и в чем собственно ваш вопрос.
Приведите структуру таблиц, набор тестовых данных строк по 10 и желаемый результат. С четкими правилами - что и как вы хотите объединить (с большой вероятностью в том случае вы сами напишите правильный запрос, а нет так понятно будет, что вам подсказать).
Неактивен
"Суммируются значения полей KolNarGKU, KolNarGKN, KolLobgr, KolObrOGV_MS, KolDecl KolZUKPKV из таблицы tab1 за 12 месяц и 2010 год"
Не совсем верно написано, а вопрос терминологии в данном случае важен. Вы не просто суммируете (в этом случае в промежуточной таблице была бы одна строка), а группируете по полю отделу (т.е. используете конструкцию group by otdel).
Колонка Date_Report в промежуточной таблице лишняя, вы ведь не берете её из первой таблицы. Это просто параметры введенные в форме и нет никакого смысла их объединять и вносить в промежуточную таблицу.
"Потом необходимо соединить tab1 и tab2 "
Нет вы объединяете промежуточную таблицу и tab2.
См приведенный мной ранее пример. Там промежуточная таблица названа именем t и объединяется со второй.
и сравнить Дату которая записана в поле Date_Report с полями RepPer и RepGod
Правильно будет сравнить параметры введенные в форме с полями RepPer и RepGod, т.е. where RepPer=12 and RepGod=2010.
P.S. Я могу, конечно, сразу написать итоговый запрос, но, полагаю, вам самому интересней разобраться.
Неактивен
Сразу неинтересно.
Думаю доразбираюсь сам. В любом случае спасибо за поправку
Неактивен
Написал...ошибок нет но вместе с отсутствием ошибок отсутствие данных
Привожу текст
Неактивен
1) "SELECT di_report.* FROM..." т.е. вы выбираете данные только из второй таблицы, хотя в исходной постановке хотели получить ещё и суммы полей из первой.
2) выполните запрос в клиенте бд, подставив вместо переменных точные значения. Если вернет результат, значит ошибка в php-скрипте. Если результат будет пустой, значит в базе нет данных, соответствующих поставленным условиям.
Неактивен
SELECT di_report.*,report_eo.* FROM report_eo,(SELECT DATE_FORMAT(`Date_report`,'%Y %m') as `Date_report`, `Otdel`, sum(`KolNarGKU`) as `KolNarGKU`, sum(`KolNarGKN`) as `KolNarGKN`, sum(`KolLobrg`) as `KolLobrg`, sum(`KolObrOGV_MS`) as `KolObrOGV_MS` , sum(`KolKPDA`)+sum(`KolOtkazFZ93`) as `KolVnes93`, sum(`KolDecl`) as `KolDecl` FROM `report_eo` WHERE `Date_Report`>='2010-12' AND `Date_Report`<='2010-12' GROUP BY `Otdel`), `rep_eo` INNER JOIN di_report,(SELECT sum(`KolLU`) as `KolLU`, sum(`PloshLU`) as `PloshLU`, sum(`ObshKolLU `) as `ObshKolLU `, sum(`PloshLUPS`) as `PloshLUPS`, sum(`KolZaprFZ93`) as `KolZaprFZ93`,sum(`KolLogr`) as `KolLogr`, sum(`KolZUKadSt`) as `KolZUKadSt`,sum(`KolTechErr`) as `KolTechErr`,sum(`VKopirDoc`) as `VKopirDoc`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN`,`RepPer`, `RepGod`) as `rep_di` ON rep_eo.`Otdel`= rep_di.`Depart` WHERE `RepPer`<='12' AND `RepPer`>='12' AND `RepGod`>='2010' AND `RepGod`<='2010';
Вобщем я чую что о5 чет перемудрил. В предыдущем запросе кстати ничего не возвращало хотя я и добавлял 2-ю таблицу. Через phpMyAdmin проверял. 0 rows.
Отредактированно FDL45 (20.12.2010 06:48:42)
Неактивен
Что-то вы совсем не то написали, предыдущий запрос был гораздо лучше.
Запись "FROM report_eo,(SELECT DATE_FORMAT..), `rep_eo`" означает, что вы делаете прямое умножение 3ех таблиц - report_eo, безымянной и `rep_eo`
Запись " di_report,() as `rep_di`" означает, что вы делаете прямое умножение 2ух таблиц di_report и `rep_di`.
Покажите лучше предыдущий вариант запроса исправленный вами.
Неактивен
SELECT di_report.*, report_eo.* FROM(SELECT DATE_FORMAT(`Date_report`,'%Y-%m') as `Date_report`, `Otdel`, sum(`KolNarGKU`) as `KolNarGKU`, sum(`KolNarGKN`) as `KolNarGKN`, sum(`KolLobrg`) as `KolLobrg`, sum(`KolObrOGV_MS`) as `KolObrOGV_MS` , sum(`KolKPDA`)+sum(`KolOtkazFZ93`) as `KolVnes93`, sum(`KolDecl`) as `KolDecl` FROM `report_eo` WHERE `Date_Report`>='2010-12' AND `Date_Report`<='2010-12' GROUP BY `Otdel`) as `rep_eo` INNER JOIN (SELECT sum(`KolLU`) as `KolLU`, sum(`PloshLU`) as `PloshLU`, sum(`ObshKolLU `) as `ObshKolLU `, sum(`PloshLUPS`) as `PloshLUPS`, sum(`KolZaprFZ93`) as `KolZaprFZ93`,sum(`KolLogr`) as `KolLogr`, sum(`KolZUKadSt`) as `KolZUKadSt`,sum(`KolTechErr`) as `KolTechErr`,sum(`VKopirDoc`) as `VKopirDoc`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN`,`RepPer`, `RepGod` FROM `di_report` WHERE `RepPer`<='12' AND `RepPer`>='12' AND `RepGod`>='2010' AND `RepGod`<='2010')) ON rep_eo.`Otdel`= di_report.`Depart`
Вот как-то так...я уже тот вариант переделал. Ругается на то что я алиасы криво использую
Неактивен
А зачем вы пишите SELECT di_report.*, report_eo.* ? Если вас интересует информация из таблицы `rep_eo`, иначе зачем вы эти суммы считали
Неактивен
Стоп, стоп. А что это у вас за безымянный селект с суммами после inner join
INNER JOIN (SELECT ...) ON rep_eo.`Otdel`= di_report.`Depart`
в 8ом посте у вас этого безобразия не было.
Неактивен
Дело в том что мне из 2-й таблицы тоже нужно будет считать суммы.
условие ON(как в 8-м посте) и потом уже писать селект с суммами для 2-й таблицы?
просто хочется уже окончательно с этим доразобраться. Чтобы не дергать светлые умы.
Неактивен
FDL45 написал:
Дело в том что мне из 2-й таблицы тоже нужно будет считать суммы.
В исходной постановке (той что в прикрепленном файле) не нужно считать суммы из второй таблицы. Вы уверены, что вам это нужно или мы говорим о разных задачах.
FDL45 написал:
условие ON(как в 8-м посте) и потом уже писать селект с суммами для 2-й таблицы?
И к чему вы этот селект будете прикреплять?
В данном случае я уже не понимаю о чем идет речь, так как исходной задаче отношения это не имеет.
Неактивен
Все сделал. Спасибо. Оказалось имена полей при выводе неправильно указал. Ну и запрос чутка переделал
Для 3-х таблиц как я понимаю аналогично?
Текст ниже...возвращает пусто
SELECT 1zk_reports.*,eo_rep.*,di_rep.* FROM(SELECT `Depart`,`RepPer`,`RepGod`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN` FROM `di_report` WHERE `RepPer`>='12' AND `RepPer`<='12' AND `RepGod`>='2010' AND `RepGod`<='2010' AND `Depart`='г.Аша' GROUP BY `Depart`) as di_rep INNER JOIN (SELECT `Otdel`, `Date_Report`, sum(`KolDocKVKPZU`) as `KolDocKVKPZU`, sum(`KolKVKPIzmZU`) as `KolKVKPIzmZU`, sum(`KolOtkazGKU`)+sum(`KolOtkazGKUIzm`) as `OtkazObsh`, sum(`KolOtkazGKUIzm`) as `KolOtkazIzm`, sum(`KolDocZPKVKPZU`) as `KolDocZPKVKPZU`, sum(`KolDocKPT`) as `KolDocKPT`, sum(`KolZKUZDay`) as `KolZKUZ`, sum(`KolZKUVSDay`) as `KolZKUVS` FROM `report_eo` WHERE `Otdel`='г.Аша' GROUP BY `Otdel`) as `eo_rep` ON di_rep.Depart=eo_rep.Otdel INNER JOIN `1zk_reports` ON di_rep.Depart=1zk_reports.Raion WHERE `RepMonth`>='12' AND `RepMonth`<='12' AND `RepGod2`>='2010' AND `RepGod2`<='2010'
И еще пока помню. В предыдущем запросе когда данные передаются то только в том случае когда выбрано одно конкретное значение из списка. Есть ли какое-то значение которое выбирает все значения поля? Спасибо
Отредактированно FDL45 (21.12.2010 11:32:20)
Неактивен
FDL45 написал:
Для 3-х таблиц как я понимаю аналогично?
Да.
FDL45 написал:
Текст ниже...возвращает пусто
Это значит, что в базе нет данных, соответствующим условиям выборки.
Если вы считаете, что запрос все-таки должен возвращать данные, то выполняйте отдельно каждый подзапрос, смотрите что выбирает и почему итоговая выборка пустая.
FDL45 написал:
И еще пока помню. В предыдущем запросе когда данные передаются то только в том случае когда выбрано одно конкретное значение из списка. Есть ли какое-то значение которое выбирает все значения поля? Спасибо
Отсутствие значения Запрос у вас ведь формирует php скрипт. В скрипте нужно смотреть, если не выбрано никакое значение, то в части where запроса не упоминать данное поле, что соответствует тому, что выборка идет по всем значениям данного поля.
Неактивен
С последним я разобрался
Использовал LIKE
И еще запрос приведенный мной выше который по 3-м таблицам верно написан?
Неактивен
Да (по крайней мере синтаксически ).
Неактивен
Неактивен
В личку писать не удастся, а объяснили скомкано. Попробуйте написать тогда,
когда будет время: Вы же хотите, чтобы мы свое время на нас потратили, правда?
Неактивен
Вобщем собрался с мыслями. Объясняю
Есть три таблицы
В 1-ю данные заносятся каждый день
Имеет вид
tab1:
Date_Report| Otdel | Параметр1 | Параметр2 | ПараметрN |
2011-01-11 |отдел1| 2 5 0
2011-01-12 |отдел1| 2 8 1
2011-01-13 |отдел1| 3 8 2
.... | |
2011-01-31 |отдел1| 56 7 6
2011-02-01 |отдел1| 6 9 3
Отделов всего 26 и каждый из них заносит данные за каждый день. Т.е 1 день = 26 разных записей.
И есть 2-е другие таблицы структуры которых похожи.
tab2:
Depart | RepGod | RepMonth| Параметр 1 Параметр 2 ПараметрN
Отдел1 | 2011 01 45 76 6
Отдел2 | 2011 01 6 6 7
Отдел3 | 2011 01 56 5 12
...
Отдел26 | 2011 01 45 8 3
Отдел1 | 2011 02 12 34 7
tab3:
Raion | RepGod | RepMonth| Параметр 1 Параметр 2 ПараметрN
Отдел1 | 2011 01 45 76 6
Отдел2 | 2011 01 61 9 8
Отдел3 | 2011 01 566 10 12
...
Отдел26 | 2011 01 42 18 43
Отдел1 | 2011 02 12 34 7
Эти две таблицы содержат данные за конкретный месяц конкретного года.
Данные берутся из формы. Заполняются раз в месяц
Суть задачи такова - объединить эти три таблицы в одну причем из 1-й данные (Параметр1...ПараметрN) должны суммироваться только за тот год и месяц который указан в 2-х других таблицах. И это должно быть для каждого района. Сейчас у меня просто группировка по району сделана и получается, что данные, которые пришли за февраль тоже войдут в выборку. А этого не нужно. Соответственно если данные пришли в за 2 месяца чтобы суммировались (Параметр1...ПараметрN) за 2 месяца. Т.е 2 записи за, допустим февраль и январь из tab2 и tab3 и данные с 2011-01-01 по 2011-02-28 включительно из tab1.
Неактивен
Правильно ли я понимаю, что Вы хотите запрос вида
INSERT INTO tab2
SELECT YEAR(Date_Report), MONTH(Date_Report), Otdel, SUM(Param1), SUM(Param2), ...
FROM tab1
GROUP BY 1, 2, 3
ON DUPLICATE KEY UPDATE Param1 = Param1 + VALUES(Param1), Param2 = Param2 + VALUES(Param2), ...
С уникальным ключом на (Year, Month, Department) должно работать.
И поименуйте все столбцы единообразно: один язык и одинаковые названия
Неактивен
Сделал по-другому. Работает. Спасибо за потраченное время
Отредактированно FDL45 (03.02.2011 15:17:38)
Неактивен