2010-07-07 1 views
40

Ich brauche Hilfe mit einer T-SQL-Abfrage. Ich möchte Felder mit einem bestimmten Wert zählen (z. B.> 1).T-SQL Zählt Zeilen mit bestimmten Werten (Mehrere in einer Abfrage)

Angenommen, ich habe eine Tabelle wie:

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 

ich ein Ergebnis wie wünschen:

IGrp | V1High | V2High 
###################### 
A | 1  | 2 
B | 2  | 1 

In meinem Kopf soll

SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High 
FROM Tbl GROUP BY IGrp 

mit diesem Ausdruck geht Aber das ist in T-SQL nicht möglich, da Count() keine booleschen Werte verwendet. Also ist es wirklich die einzige Möglichkeit, mehrere Abfragen mit WHERE Value>1 und COUNT(*) zu machen und sie danach zu verbinden? Oder gibt es einen Trick, um das gewünschte Ergebnis zu erzielen?

Vielen Dank im Voraus.

Antwort

64
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 
+0

Irgendeine Idee, wie dies die Leistung beeinflusst? – BrianFinkel

+2

Basierend auf meiner Erfahrung kann SQL Server mit diesem Befehl gut arbeiten. – jing

0

Sie können eine CASE .. WHEN ..-Anweisung innerhalb der COUNT() -Funktionen setzen, um 1 zurückzugeben, wenn die Bedingungen gelten, ansonsten NULL.

3

nutzen case when für Sie tun Arbeit

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 
+0

Danke, irgendwie habe ich nicht daran gedacht. – Marks

+2

Dies wird nicht funktionieren. Alle Nicht-Null-Werte sind in der Zählung enthalten. – LukeH

+0

jetzt wird dies auch die Null-Werte –

9

Sie die CASE Anweisung verwenden:

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 
+2

Dies wird nicht funktionieren. Alle Nicht-Null-Werte sind in der Zählung enthalten. – LukeH

+1

@LukeH - ja du hast recht, ich meinte SUM ... – cjk

+0

@HoseynHeydari nein, überprüfe die Änderungen, korrigiere ich und das Beispiel ist jetzt korrekt. Wenn eine Antwort auf SO falsch ist, wird sie gelöscht. – cjk

2
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 

Dies kann auch 2 verschiedene Werte vergleichen verwendet werden für das gleiche Feld, mit geringfügigen Änderungen wie oben gezeigt.

Sehr hilfreich für die Überprüfung von Werten, die in einem Verhältnis von 1: 1 existieren sollen.

Verwandte Themen