2016-10-17 5 views
0

I Ausgabe mit 2 Spalten in Gruppierung, halten Störung zu erhalten:SQL Gruppendaten von 2 Spalte

Spalte ‚# TEM1.STATUS‘ ist ungültig in der Auswahlliste, weil es nicht enthalten entweder in einem Aggregat Funktion oder die GROUP BY-Klausel.

unten sind meine gespeicherten Prozedur Code:

SELECT COUNT(Employee_ID),Roster_Code,STATUS 
FROM #TEM1 GROUP BY Roster_Code,Department 

TEM1 Tabelle ist eigentlich eine temporäre table.i zu einer Gruppe von Abteilung und Roster Code sie wollen. unten sind meine TEM1 Daten: enter image description here

meine erwartete Ausgabe:

enter image description here

+0

Sie sollten PIVOT verwenden, denke ich. –

+0

Der Fehler ist genau das, was in der Fehlermeldung ist. Stoppen Sie die Auswahl von 'STATUS'. – Terminus

+0

aber der Status ist wichtig, um abwesend oder anwesend zu zählen – KyLim

Antwort

2

Angabe „GROUP BY Roster_Code, Abteilung“ im Grunde bedeutet, dass Sie für jede unterschiedliche Kombination eine Zeile in der Ausgabe zu sehen erwarten von Roster_Code und Department, die in der Tabelle vorhanden sind.

Zum Beispiel würde die Ausgabe eine Zeile für Roster_Code = A, Abteilung = HRS enthalten. Aber es gibt einige Zeilen in dieser Gruppe mit STATUS = IN und andere mit STATUS = ABSENT. Daher ist nicht klar, was Sie in dieser Situation in der Ausgabe erwarten. Daher wird eine Fehlermeldung angezeigt.

Aus diesem Grund können Sie nicht einfach 'STATUS' auswählen - entweder müssen Sie es in die GROUP BY-Klausel aufnehmen (damit Sie für jeden STATUS unterschiedliche Zeilen in der Ausgabe haben) oder eine Aggregatfunktion verwenden, die SQL Server mitteilt wie man die mehreren Werte zu einem einzigen Wert kombiniert, den sie ausgeben kann.

Es sieht so aus, als ob Sie tatsächlich versuchen, zu Count die Anzahl der Mitarbeiter mit 'IN' Status und die Gesamtzahl der Mitarbeiter. Dies bedeutet wahrscheinlich, dass Sie die COUNT() - Aggregatfunktion verwenden möchten.

ist hier ein Schritt in Richtung Ausgang Sie wollen:

SELECT Department, 
     Roster_Code, 
     COUNT(CASE WHEN STATUS='IN' THEN 1 ELSE NULL END) IN_STATUSES, 
     COUNT(*) TOTAL_STATUSES 
FROM #TEM1 GROUP BY Department, Roster_Code 

Es sieht aus wie Sie auch alle Roster anderer Code als A/B/D/E als ‚Andere‘ klassifizieren wollen, so können wir hinzufügen ein weiterer Schritt, das zu tun:

SELECT Department, 
     Roster_Code, 
     COUNT(CASE WHEN STATUS='IN' THEN 1 ELSE NULL END) IN_STATUSES, 
     COUNT(*) TOTAL_STATUSES 
FROM 
(
    SELECT Department, 
      CASE WHEN Roster_Code IN ('A','B','D','E') THEN Roster_Code ELSE 'Other' END Roster_Code, 
      STATUS 
    FROM #TEM1 
) x 
GROUP BY Department, Roster_Code 

Es sieht aus wie Sie auch eine „Pivot“ Operation ausgeführt werden soll, die die einzelnen Reihen nehmen wir derzeit für A/B/D/E/Andere haben und wandeln diese in ihre eigenen Spalten in einer einzigen Zeile. Dann werden Sie die Status-Zählungen, die wir gegenwärtig haben, in Zeichenfolgen der Form "3/4" kombinieren wollen - dies ist nur ein Fall der Verkettung (z. B. IN_STATUSES + '/' + TOTAL_STATUSES).