Regrouper par lorsque vous rejoignez deux fois la même table
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.
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.