web-dev-qa-db-fra.com

Nombre de lignes T-SQL avec des valeurs spécifiques (requête multiple en une seule)

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.

43
Marks
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
68
LukeH

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 
10
cjk

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 
3
Pranay Rana
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.

2
user2125525

Vous pouvez placer une instruction CASE .. WHEN .. dans les fonctions COUNT () pour renvoyer 1 lorsque les conditions sont réunies, NULL sinon.

0
Panagiotis Kanavos