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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top