осталось присоединиться не так, как ожидалось, с суммой и группой - PullRequest
0 голосов
/ 20 февраля 2011

Все это должно быть псевдо, так как я нахожусь на своем телефоне, и у меня нет доступа к Интернету сейчас, потому что я только что переехал, но это вывело меня из себя.Это также означает, что я не могу делать блоки кода, пожалуйста, потерпите меня:

У меня есть таблица с суммами, и у меня есть таблица с метками.Я хочу суммировать суммы в первой таблице, сгруппированные по меткам.Проблема в том, что если в таблице нет записей для метки с суммами, то я не получаю записи в наборе результатов для этой метки.Мне нужна запись там с нулями для поля количества таблиц.Вот как могут выглядеть некоторые примеры данных:

Amount_table:

Столбцы: id, tpa, amt, link_to_label_table

Данные:

1, GTL, 2000, 1
2, GTL, 1000, 1

Label_table:

Столбцы: link_to_amount_table, label_name

Данные:

1, Label1
2, Label2

Запрос:

Select at.tpa, sum(at.amt) as amt, lt.label_name
From Amount_table as at
Left join Label_tabl lt on lt.link_to_amount_table = at.link_to_label_table
Where at.tpa = 'GTL' 
Group by lt.label, at.tpa

Теперь это возвращает:

GTL, 3000, Label1

Я попытался выбрать из таблицы меток, затем оставил соединение с таблицей сумм, и он все еще не дал желаемых результатов:

GTL, 3000, Label1
Null, Null, Label2

Возможно ли это с суммой и сгруппировать по?Поля, сгруппированные по, должны быть там, иначе вы получите ошибку.Это в DB2, кстати.Есть ли какой-нибудь способ заставить это вернуть мне то, что мне нужно?Я должен получить этикетки;они динамические.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2011

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

SELECT a.tpa, sum(a.amt) as amt, l.label_name
  FROM Label_table AS l
  LEFT JOIN Amount_table AS a
    ON l.link_to_amount_table = a.link_to_label_table
 GROUP BY l.label, a.tpa

У вас есть состояние Amount_table.tpa = 'GTL'; не совсем понятно, почему у вас это есть, но, вероятно, это важно, поскольку в таблицах больше данных. Есть (как минимум) два способа включить это условие в запрос (кроме того, который вы выбрали - что исключает строки, в которых a.tpa равно нулю).

SELECT a.tpa, sum(a.amt) as amt, l.label_name
  FROM Label_table AS l
  LEFT JOIN Amount_table AS a
    ON l.link_to_amount_table = a.link_to_label_table
   AND a.tpa = 'GTL'
 GROUP BY l.label, a.tpa

Или:

* * 1010

Приличный оптимизатор создаст один и тот же план запросов для обоих, поэтому, вероятно, не имеет значения, какой вы используете. Существует аргумент, который предполагает, что вторая альтернатива является более чистой в том смысле, что предложение ON в первую очередь предназначено для условий объединения, а условие фильтра для a.tpa не является условием объединения. Есть еще один аргумент, который говорит, что первая альтернатива избегает подзапроса и поэтому предпочтительнее. Я бы подтвердил, что планы запросов одинаковы и, вероятно, выберут второй, но это несколько туманное решение, основанное на умеренных предпочтениях.

0 голосов
/ 20 февраля 2011

Вы были так близки со второй попытки. Поменяйте ГДЕ на И. Это приводит к применению at.tpa = 'GTL' к JOIN вместо того, чтобы применять его к фильтру, чтобы вы не отфильтровывали NULL.

...