Группировать по при повторном присоединении к одной и той же таблице
Вопрос
Я пишу запрос для обобщения некоторых данных.У меня есть флаг в таблице, который в основном логический, поэтому мне нужны некоторые суммы и подсчеты, основанные на одном его значении, а затем то же самое для другого значения, вот так:
select
location
,count(*)
,sum(duration)
from my.table
where type = 'X'
and location = @location
and date(some_tstamp) = @date
group by location
И затем то же самое для другого значения столбца типа.Если я присоединюсь к этой таблице дважды, как мне по-прежнему группировать, чтобы я мог получать агрегацию только для каждой таблицы, т.е.граф (a.*
) вместо count(*)...
Было бы лучше написать два отдельных запроса?
Редактировать
Спасибо всем, но это не то, что я имел в виду.Мне нужно получить сводку, где type = 'X', и сводку, где type = 'Y' по отдельности...позвольте мне опубликовать лучший пример.Я имел в виду запрос, подобный этому:
select
a.location
,count(a.*)
,sum(a.duration)
,count(b.*)
,sum(b.duration)
from my.table a, my.table b
where a.type = 'X'
and a.location = @location
and date(a.some_tstamp) = @date
and b.location = @location
and date(b.some_tstamp) = @date
and b.type = 'Y'
group by a.location
По чему мне нужно сгруппироваться?Кроме того, DB2 не нравится count(a.*
), это синтаксическая ошибка.
Решение
select
location
,Sum(case when type = 'X' then 1 else 0 end) as xCount
,Sum(case when type = 'Y' then 1 else 0 end) as YCount
,Sum(case when type = 'X' then duration else 0 end) as xCountDuration
,Sum(case when type = 'Y' then duration else 0 end) as YCountDuration
from my.table
where
location = @location
and date(some_tstamp) = @date
group by location
Это должно работать в SQL Server.Я думаю, у db2 должно быть что-то подобное.
Редактировать:Добавьте условие where, чтобы ограничить записи выбором type = X или type = Y, если "тип" может иметь значение, отличное от X и Y.
Другие советы
Ваш пример с объединением не имеет большого смысла.Вы выполняете декартово произведение между A и B.Это действительно то, чего ты хочешь?
Ниже будут найдены count(*) и sum(duration) для каждой пары, которая удовлетворяет предложению WHERE.Судя по вашему описанию, это похоже на то, что вы ищете:
select
type
,location
,count(*)
,sum(duration)
from my.table
where type IN ('X', 'Y')
and location = @location
and date(some_tstamp) = @date
group by type, location
Чтобы заставить подсчеты работать, вместо count(a.*) просто сделайте count(a.location) или любой другой ненулевой столбец (PK был бы идеальным).
Что касается главного вопроса, то сработал бы любой из приведенных выше ответов шахкальпеша или Джорджа Идона.В этом примере нет причин присоединяться к таблице дважды.