SQL: Как я могу вернуть нули, где нечего агрегировать? - PullRequest
1 голос
/ 15 марта 2010

То, что я хотел бы спросить, лучше всего иллюстрирует пример, так что терпите меня. Предположим, у меня есть следующая таблица:

TypeID  Gender      Count
1       M           10
1       F           3
1       F           6  
3       M           11
3       M           8

Я хотел бы объединить это для каждой возможной комбинации TypeID и Gender. Где TypeID может быть 1,2 или 3, а Gender может быть M или F. Итак, я хочу следующее:

TypeID  Gender      SUM(Count)
1       M           10
1       F           9
2       M           0  
2       F           0
3       M           19
3       F           0

Я могу придумать несколько способов сделать это, но ни один из них не кажется мне особенно элегантным.

Любые предложения будут с благодарностью!

Karl

Ответы [ 2 ]

6 голосов
/ 15 марта 2010

Используйте производные таблицы для создания строк, которые вы хотите вернуть, и оставьте соединение, чтобы получить количество. Используйте COALESCE, чтобы превратить любые значения NULL в нули.

SELECT TypeIds.TypeId, Genders.Gender, COALESCE(SUM(T1.Count), 0)
FROM (
    SELECT 1 AS TypeId
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
) AS TypeIds
CROSS JOIN (
    SELECT 'M' AS Gender
    UNION ALL
    SELECT 'F'
) AS Genders
LEFT JOIN Table1 AS T1
ON TypeIds.TypeId = T1.TypeId AND Genders.Gender = T1.Gender
GROUP BY TypeIds.TypeId, Genders.Gender

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

0 голосов
/ 15 марта 2010

Как насчет создания временной таблицы, которая будет содержать записи, которые не включены в вашу таблицу, затем выполните этот скрипт?

SELECT TypeID, Gender, [Count]=ISNULL(Count(*),0)  
  FROM <TABLE> 
GROUP BY TypeID, Gender
...