Question

J'écris une requête pour résumer certaines données. J'ai un drapeau dans la table qui est fondamentalement booléen, j'ai donc besoin de sommes et de comptes en fonction d'une valeur, puis de la même chose pour l'autre valeur, comme suit:

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

Et le même pour une autre valeur de la colonne type. Si je rejoins deux fois cette table, comment puis-je toujours grouper pour ne pouvoir obtenir qu'une agrégation pour chaque table, c'est-à-dire count (a. * ) au lieu de count (*) ...

Serait-il préférable d'écrire deux requêtes distinctes?

MODIFIER

Merci à tous, mais ce n'est pas ce que je voulais dire. Je dois obtenir un résumé où type = 'X' et un résumé où type = 'Y' séparément ... permettez-moi de vous en donner un meilleur exemple. Ce que je voulais dire était une requête comme celle-ci:

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

De quoi ai-je besoin pour grouper? De plus, DB2 n'aime pas le nombre (a. * ), c'est une erreur de syntaxe.

Était-ce utile?

La solution


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

Cela devrait fonctionner dans SQL Server. Je suppose que db2 devrait avoir quelque chose de similaire.

Modifier: ajoutez une condition where pour limiter les enregistrements afin de sélectionner le type = X ou le type = Y, si " type " peut avoir une valeur autre que X et Y.

Autres conseils

Votre exemple de jointure n'a pas beaucoup de sens. Vous faites un produit cartésien entre A et B. Est-ce vraiment ce que vous voulez?

Les éléments suivants trouveront le nombre (*) et la somme (durée) pour chaque paire satisfaisant à la clause WHERE. Selon votre description, cela ressemble à ce que vous recherchez:

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

Pour que les comptages fonctionnent, au lieu de count (a. *), comptez simplement (a.location), ou n’importe quelle autre colonne non nulle (la clé serait idéale).

En ce qui concerne la question principale, l'une ou l'autre des réponses données par Shahkalpesh ou par George Eadon ci-dessus fonctionnerait. Dans cet exemple, il n’ya aucune raison de joindre la table deux fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top