J'ai besoin d'aide pour une requête T-SQL. Je veux compter les champs qui ont une valeur spéciale (par exemple> 1).
En supposant que j'ai une table comme:
IGrp | Item | Value1 | Value2
#############################
A | I11 | 0.52 | 1.18
A | I12 | 1.30 | 0.54
A | I21 | 0.49 | 2.37
B | I22 | 2.16 | 1.12
B | I31 | 1.50 | 0.28
Je veux un résultat comme:
IGrp | V1High | V2High
######################
A | 1 | 2
B | 2 | 1
Dans mon esprit, cela devrait aller avec cette expression
SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High
FROM Tbl GROUP BY IGrp
Mais ce n'est pas possible dans T-SQL car Count () ne prend pas de valeurs booléennes. Est-ce vraiment le seul moyen possible de faire plusieurs requêtes avec WHERE Value>1
Et COUNT(*)
et de les joindre ensuite? Ou existe-t-il une astuce pour obtenir le résultat souhaité?
Merci d'avance.
SELECT IGrp,
COUNT(CASE WHEN Value1 > 1 THEN 1 ELSE NULL END) AS V1High,
COUNT(CASE WHEN Value2 > 1 THEN 1 ELSE NULL END) AS V2High
FROM Tbl
GROUP BY IGrp
Vous pouvez utiliser l'instruction CASE
:
SELECT IGrp,
SUM(CASE WHEN Value1>1 THEN 1 ELSE 0 END) AS V1High,
SUM(CASE WHEN Value2>1 THEN 1 ELSE 0 END) AS V2High
FROM Tbl GROUP BY IGrp
se servir de case when
travaillera pour vous
SELECT IGrp,
sum(case when isnull(Value1,0)>1 then 1 else 0 end) AS V1High,
sum(case when isnull(Value2,0)>1 then 1 else 0 end) AS V2High
FROM Tbl GROUP BY IGrp
SELECT IGrp,
COUNT(CASE WHEN Value1 = 'Foo' THEN 1 ELSE NULL END) AS Tot_Foo,
COUNT(CASE WHEN Value1 = 'Blah' THEN 1 ELSE NULL END) AS Tot_Blah
FROM Tbl
GROUP BY IGrp
Cela peut également être utilisé pour comparer 2 valeurs différentes pour le même champ, avec des modifications mineures comme indiqué ci-dessus.
Très utile pour vérifier les valeurs supposées exister dans un rapport 1: 1.
Vous pouvez placer une instruction CASE .. WHEN .. dans les fonctions COUNT () pour renvoyer 1 lorsque les conditions sont réunies, NULL sinon.