2017-10-23 5 views
1

ich die Daten wie folgt haben:SQL Fall zwei Bedingungen zwei Spalten


"Table" Computerdaten

date  | property | computer code 
----------  --------  ----------- 
20160131 | companyA |  256584 
20160131 | companyB |  987451 

zu etc

20171020 | companyA |  157489 

Ich möchte die Anzahl zählen Computer in jedem Unternehmen nach 2017-Sep, so verwende ich:

select 
computer data 

, count (case computer code when property='companyA' and date='20171001' then 1 else 0 end) as CMAnumber 
, count (case computer code when property='companyB' and date='20171001' then 1 else 0 end) as CMBnumber 

from 
[data] 

group by 
computer data 

order by 
computer data 

aber es funktioniert nicht ...
bitte helfen !!

Ich benutze SQL Server 2014 Management Studio. und die Datenbank von der Firma System

und ich möchte zeigen, es wie

date | CMAnumber | CMBnumber 

20171001 | 200 | 210 

20171002 | 230 | 207 

ETC

leid, dass ich ein frisches auf SQL TT

+0

Pflege zu erarbeiten über „aber es nicht“ eine Kombination aus Unterabfrage und Gruppe tun? Erhalten Sie einen Fehler? Die falschen Ergebnisse? – Mureinik

+1

'COUNT()' zählt alle Nicht-Null-Werte, d.h. sowohl 1 als auch 0 werden gezählt. Tun Sie stattdessen 'SUM()'. – jarlh

+0

oder verwenden COUNT() zu zählen, nur füttern es NULL, wenn das erforderlich ist –

Antwort

1

Wenn Sie CASE verwenden möchten für einige Bedingungen zählen, und wenn Sie COUNT Funktion für sie, sonst Teil des Gehäuses wählen sollte NULL sein sonst zählt es auch anders. Oder Sie sollten SUMME statt COUNT verwenden. Ich habe das Skript für die COUNT-Funktion aktualisiert.

Und Ihr Fall mit falsch, ich habe es auch korrigiert.

SELECT 
[computer data] 
, count (case when property='companyA' and date >= '20171001' then 1 end) as CMAnumber 
, count (case when property='companyB' and date >= '20171001' then 1 end) as CMBnumber 
from 
    [data] 
where 
    date >= '20171001' 
group by 
    [computer data] 
order by 
    [computer data] 
+0

Das Datum kann nicht sortieren nach Oktober-2017, die Daten von Jan-2011 gezeigt und die ganze Anzahl sein 0 –

+0

Sorry, ich habe diesen Teil verpasst, habe ich das Skript aktualisiert. –

+0

es funktioniert !! ich danke dir sehr. –

0

Was dazu:

SELECT property , COUNT(*) 
    FROM [data] 
WHERE DATE > '20170930' 
GROUP BY property ; 
+0

Bitte lesen Sie die Frage richtig –

+0

@CraigYoung, tat ich und Wenn die PO nur an einer Sammlung von Unternehmen interessiert ist (wie er geschrieben hat), kann sie einfach eine AND-Eigenschaft IN (...) hinzufügen. Ich sehe keinen Grund, Dinge kompliziert zu machen, wenn sie sehr einfach sein können. Das ganze "Fall" -Konstrukt wird überhaupt nicht benötigt. Das einzige ist ein PIVOT der Antwort, die durch einen einfachen SELECT-Umbruch der von mir vorgeschlagenen erstellt werden könnte. – FDavidov

+0

OP versucht ganz klar, 2 separate Zählungen für 2 verschiedene Unternehmen zu erhalten. Deine Antwort kommt bei weitem nicht dazu. Ihre Antwort führt auch nicht zu einem der beiden spezifischen Probleme, vor denen OP steht. –

2

Sie mischen zwei case Formulare.

serached Die Form hat einen Zustand nach der when:

CASE WHEN <condition> .. 

Die einfache Form hat aufgeteilt: einen gemeinsamen Operanden zwischen case und when und Ausdrücke nach der when. Es impliziert ein Gleichheits Vergleich:

CASE <common operand> WHEN <expression> ... 

Mehr über Fall: http://modern-sql.com/feature/case

0

Sie können

select property,count(*) from (select * from [computer data] where date > '20170930') group by property 
+0

Ich habe Msg 102, Ebene 15, Status 1, Zeile 3 Falsche Syntax nahe '='. –

+0

Überprüfen Sie, ob Tabellennamen und Spaltennamen korrekt sind –

Verwandte Themen