2016-05-12 7 views
0

Ich muss eine Ansicht erstellen, die verschiedene Summen anzeigt.Erstellen Sie eine Ansicht mit Summen aus mehreren Spalten

Ich habe zwei Tabellen. Eines mit UserIDs und einem Statuscode einer Bewerbung. Die andere hat die UserID und 4 Spalten, die Boolean 0/1 enthalten. Jede dieser Spalten zeigt eine Job-Fähigkeit an (wie Laufen, Springen, Werfen, Klettern). Die Ansicht muss nur die Summen für jede Job-Fähigkeit anzeigen, einmal für laufende Anwendungen und einmal für die abgeschlossenen Aufgaben. Ich habe Probleme, die Gruppe herauszufinden und Spalten für jede Fähigkeit auszuwählen.

Die Benutzertabelle hat ID (int) und ApplicationStatus (varchar4).
Der applicationStatus ist:

  • 0000, wenn es nicht gestartet
  • 0500 hat, wenn es läuft
  • 1000, wenn Sie fertig.

Die Jobskills Tabelle hat eine: ID, eine passende UserID für die Usertable und 4 JobSkill Spalten: JobSkill_1, JobSkill_2, JobSkill_3 und JobSkill_4, die jeweils als eine ganze Zahl definiert sind und A 1 zu enthalten, wenn der Benutzer diese Fähigkeit hat .
Der Blick sollte eine Zusammenfassung zeigen:

  • , wie viele Benutzer Status
  • von 0000 hat, wie viele Status von 0500
  • wie viele haben den Status von 1000
  • wie viele haben Status hat von 1000 und JobSkill_1 = 1
  • wie viele haben den Status von 1000 und JobSkill_2 = 1
  • wie viele haben den Status von 1000 und JobSkill_3 = 1
  • und wie viele haben den Status von 1000 und JobSkill_4 = 1

Etwas wie:

SELECT 
    [UserID], 
    SUM(JobSKill_1) as Run, 
    SUM(JobSkill_2) AS Jump, 
    SUM(JobSkill_3) AS Throw, 
    SUM(JobSkill_4) AS Climb 
FROM [dbo].[tblJobSkills] 
GROUP BY [UserID] WITH ROLLUP 
+0

Wenn Sie schreiben, was Code, den Sie geschrieben haben, können wir keine Probleme mit ihm zu identifizieren! –

+0

Bitte posten Sie Definitionen Ihrer Tabellen, Beispieldaten, die in Tabellen gespeichert sind, und ein Beispiel dafür, welche Daten Sie erhalten möchten. – Alex

+0

Können wir bitte eine definitive "bedingte Aggregat" Antwort erhalten, um all diese als Duplikate zu markieren? –

Antwort

1

Es sieht aus wie Sie bedingte Aggregation benötigen, um die Ergebnisse zu erzielen, die Sie benötigen.

In SQL Server-Aggregatfunktionen können Ausdruck als Argument (zum Beispiel SUM).

Daher ist es möglich, CASE zu haben, wenn Ausdrücke in Aggregatfunktionen
SUM(CASE WHEN a = b THEN c ELSE d END)
wobei a, b, c, d können Spalten, Konstanten, Funktionen oder Ausdrücke (siehe CASE)

Die oben sein bewirkt, dass der CASE-Ausdruck für jede Zeile ausgewertet wird und das Ergebnis als Eingabe an die SUM-Funktion übergeben wird.

Anmerkung: Die obige unterscheidet sich von CASE WHEN SUM() eine THEN ELSE b c END wie in diesem Fall SUM-Funktion verarbeitet alle Eingabezeilen = erster und nur die Ergebnisse der SUM-Funktion verglichen.

Mit dem obigen Ansatz ist es möglich, auf einer anderen Reihe von Bedingungen zu aggregieren als was in der GROUP BY angegeben ist.

Die Lösung für Ihr Problem (0.59 Beziehung zwischen Benutzer und unter der Annahme, Jobskills) unter:

SELECT SUM(CASE ApplicationStatus WHEN '0000' THEN 1 ELSE 0 END) AS NotStartedCnt, 
    SUM(CASE ApplicationStatus WHEN '0500' THEN 1 ELSE 0 END) AS InProgressCnt, 
    SUM(CASE ApplicationStatus WHEN '1000' THEN 1 ELSE 0 END) AS CompletedCnt, 
    SUM(CASE ApplicationStatus WHEN '1000' THEN JobSkill_1 ELSE 0 END) AS JobSkill_1Count, 
    SUM(CASE ApplicationStatus WHEN '1000' THEN JobSkill_2 ELSE 0 END) AS JobSkill_2Count, 
    SUM(CASE ApplicationStatus WHEN '1000' THEN JobSkill_3 ELSE 0 END) AS JobSkill_3Count, 
    SUM(CASE ApplicationStatus WHEN '1000' THEN JobSkill_4 ELSE 0 END) AS JobSkill_4Count 
FROM User AS U 
    INNER JOIN JobSkills AS JS ON U.ID = JS.UserID 
Verwandte Themen