Grupo de quando juntar à mesma mesa duas vezes
Pergunta
Eu estou escrevendo uma consulta para resumir alguns dados. Eu tenho uma bandeira na tabela que é basicamente booleano, então eu preciso de algumas somas e contagens com base em um valor da mesma, e, em seguida, a mesma coisa para o outro valor, assim:
select
location
,count(*)
,sum(duration)
from my.table
where type = 'X'
and location = @location
and date(some_tstamp) = @date
group by location
E, em seguida, o mesmo para outro valor da coluna tipo. Se eu participar desta mesa duas vezes, como é que eu ainda grupo então eu só pode obter a agregação para cada tabela, contagem ou seja (a.*
) em vez de COUNT (*) ...
Seria melhor para escrever duas consultas separadas?
Editar
Obrigado a todos, mas isso é não o que eu quis dizer. Eu preciso para obter um resumo onde type = 'X' e um resumo onde type = 'Y' separadamente ... deixe-me postar um exemplo melhor. O que eu quis dizer foi uma consulta como esta:
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
O que eu preciso agrupar por? Além disso, o DB2 não como count (a.*
), é um erro de sintaxe.
Solução
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
Isso deve funcionar no SQL Server. Eu acho que o DB2 deve ter algo semelhante.
Editar: Adicionar uma condição onde a limitar os registos para seleccionar o tipo = X ou Tipo Y =, se "tipo" pode ter um valor diferente de X e Y.
Outras dicas
O seu exemplo, com a junção não faz muito sentido. Você está fazendo um produto cartesiano entre A e B. Isso é realmente o que você quer?
A seguir irá encontrar count (*) e sum (duração) para cada par que satisfaça a cláusula WHERE. Com base na sua descrição, isso soa como o que você está procurando:
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
Para fazer a contagem de trabalho, em vez de count (a. *) Apenas fazer count (a.location), ou qualquer coluna não-nula (a PK seria o ideal).
Quanto à questão principal, uma das respostas dadas pelos shahkalpesh ou George Eadon acima iria funcionar. Não há nenhuma razão neste exemplo para se juntar a tabela duas vezes.