Группировать по при повторном присоединении к одной и той же таблице

StackOverflow https://stackoverflow.com/questions/227457

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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 был бы идеальным).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top