Группировка по при соединении к одной таблице дважды - PullRequest
1 голос
/ 23 октября 2008

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

select
   location
  ,count(*)
  ,sum(duration)
from my.table
where type = 'X'
  and location = @location
  and date(some_tstamp) = @date
group by location

И то же самое для другого значения столбца типа. Если я присоединяюсь к этой таблице дважды, как мне все еще группировать, чтобы я мог получать агрегацию только для каждой таблицы, то есть count (a. *) вместо count (*) ...

Было бы лучше написать два отдельных запроса?

EDIT

Спасибо всем, но я не это имел в виду. Мне нужно получить резюме, где 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. *), это синтаксическая ошибка.

Ответы [ 3 ]

6 голосов
/ 23 октября 2008

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, если «type» может иметь значение, отличное от X и Y.

5 голосов
/ 23 октября 2008

Ваш пример с объединением не имеет большого смысла. Вы делаете декартово произведение между А и В. Это действительно то, что вы хотите?

Следующее найдет количество (*) и сумму (продолжительность) для каждой пары, которая удовлетворяет предложению 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
1 голос
/ 23 октября 2008

Чтобы заставить работать счетчики, вместо счетчика (a. *) Просто делайте счет (a.location) или любой другой столбец, отличный от нуля (PK был бы идеальным).

Что касается основного вопроса, то подойдет любой из ответов, данных Шахкалпешем или Джорджем Идоном выше. В этом примере нет причин присоединяться к таблице дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...