xpavel86
Дата: 08.11.2009 23:10:32
Здравствуйте форумчане!
Помогите решить задачку.
Есть три связанные таблицы Spravochnik , arenda1 - (куда подставляются значения из справочника) и arenda2 связанная с arenda1.
Требуется агрегировать одно из полей arenda2 и подставить значение в arenda1.
Когда делаю вот так то все работает, но мне все поля нужно перечислить.
SELECT Spravochnik.Organization, Spravochnik.Key, sum(arenda) AS calc
FROM (Spravochnik RIGHT JOIN Arenda1 ON Spravochnik.Key=Arenda1.key_sprav) LEFT JOIN Arenda2 ON Arenda1.Key=Arenda2.Key_arenda
GROUP BY Spravochnik.Organization, Spravochnik.Key;
sum(arenda) AS calc - вычисляется поле.
А когда добавляю поле (arenda) из "средней" таблицы, то агрегирование не срабатывает
SELECT Spravochnik.Organization, Spravochnik.Key, arenda, sum(arenda) AS calc
FROM (Spravochnik RIGHT JOIN Arenda1 ON Spravochnik.Key=Arenda1.key_sprav) LEFT JOIN Arenda2 ON Arenda1.Key=Arenda2.Key_arenda
GROUP BY Spravochnik.Organization, Spravochnik.Key, arenda;
Извините за столь длинный запрос:)
Чувствую нужен вложенный запрос, а как его написать ума не приложу.
Прошу, подскажите пожалуйста как правильно сделать.
Моя база во вложении
-VIPer-
Дата: 09.11.2009 09:09:56
xpavel86,
Суммируются (агрегируются) только те строки, поля которых можно сгруппировать (группировка).
Группируются только те поля, значение котороых идентичны.
Rivkin Dmitry
Дата: 09.11.2009 09:26:34
Ну, матчасть учить надо. Когда ты в группировку вводишь поле arenda то sum(arenda) становится бессмысленным, поскольку суммирование идет по организации, ключу из справочника и сумме аренды. Только если значения arenda в разных строках для первцх двух ключей совпадут, ты получишь сумму arenda. Во всех других случаях суммирования, естественно, не произойдет. Да, и зачем группировать по аренде?
ЗЫ
1. Чтобы не путать ключи, лучше называть их в разных таблицах одинаково. Т.е. в таблице Spravochnik ключ д.б. key_sprav, а в Arenda1 Key_arenda1 и, соответственно, в Arenda2 он болжен быть так же Key_arenda1
2. Не добапить ли внешние ключи (Foreign Key) на связи между таблицами и не заменить ли после этого LEFT и RIGHT JOIN на INNER JOIN. Мне кажется - напрашивается.