2016-05-20 9 views
0

Ich habe die folgende Abfrage. Und alle müssen zusammenzufassen von der Abfrage zurückgegeben „distinct Fall“ Werte eine Zeile in einer anderen Spalte „TotalDepartmentsCount“ bevölkert withingSumme aller zurückgegebenen Werte aus der CASE-Klausel-Anweisung

;WITH CTE 
    AS 
    (
    Select t.ID As [CTE_ID] 
      ,count(distinct case when e.Department='M' then t.ID else null end) as M_Marketing 
      ,count(distinct case when e.Department='S' then t.ID else null end) as S_Sales 
      ,count(distinct case when e.Department='U' then t.ID else null end) as U_Utilization  
      ,count(distinct case when e.Department=' ' then t.ID else null end) as No_NoDepartment 
     From dbo.Table t (nolock) 
      Left Join dbo.ClearedEmployee ce (nolock) ON t.ID = ce.building_fk 
       Join dbo.Employee e (nolock) ON ce.employee_fk = e.employee_pk 
     Group By t.ID 
    ) 

    Select *, t.ID 
    From CTE c (nolock) 
    FULL JOIN dbo.Table t (nolock) ON t.ID=c.[CTE_ID] 
    Order By t.ID ASC; 

es zu tun habe ich diesen Code in der Auswahlliste:

sum(cast(e.Department as int)) As TotalDepartmentsCount 

Aber das wird nicht richtig zusammengefasst (siehe Screenshot unten). Bitte beraten. enter image description here

Dies ist, wie ich meine Ausgabe haben will (die TotalDepartmentsCount siehe Tabelle)

enter image description here

+0

Also, wenn Sie 1 Marketing und 2 keine Abteilungen in einer Reihe haben, sollte die Summe 3 sein? Oder sollte es 1 sein? – APH

+0

Ihr Screenshot fehlt 't.ID', was bei der Analyse Ihrer Frage hilfreich wäre. –

+0

Warum alle NOLOCK Hinweise? Sind Sie mit fehlenden und/oder doppelten Zeilen in Ordnung? http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ Wenn Sie bei der Verwendung von Abfragehinweisen bleiben möchten, müssen Sie das WITH-Schlüsselwort einschließen. Wenn man es auslässt, ist es veraltet, es wird in der Zukunft erforderlich sein. –

Antwort

1

Ihr CTE berechnet derzeit 4 Zählungen von auf Abteilung basierte Filterung. Was Sie wollen, ist eine 5. Zählung, die alle Zeilen enthält (z. B. keine Filterung). So sollten Sie in der Lage sein, diese Spalte zu Ihrem CTE hinzufügen wie folgt:

;WITH CTE 
AS 
(
Select t.ID As [CTE_ID] 
     ,count(distinct case when e.Department='M' then t.ID else null end) as M_Marketing 
     ,count(distinct case when e.Department='S' then t.ID else null end) as S_Sales 
     ,count(distinct case when e.Department='U' then t.ID else null end) as U_Utilization  
     ,count(distinct case when e.Department=' ' then t.ID else null end) as No_NoDepartment 
     ,count(distinct t.ID) as TotalDepartmentsCount 
    From dbo.Table t (nolock) 
     Left Join dbo.ClearedEmployee ce (nolock) ON t.ID = ce.building_fk 
      Join dbo.Employee e (nolock) ON ce.employee_fk = e.employee_pk 
    Group By t.ID 
) 

Die oben wird funktionieren, solange die Department Spalte enthält nur die vier spezifischen Werte verwendet, in verschiedenen Fällen (‚M‘, ‚S‘ , 'U' und ''). Wenn Sie andere Department Werte haben können, die Sie ignorieren müssen, können Sie die TotalDepartmentsCount Spalte in der CTE ändern wie folgt berechnet werden:

,count(distinct case when e.Department in ('M', 'S', 'U', ' ') then t.ID else null end) as TotalDepartmentsCount 

Oder Sie können einfach die Summe der vier Spalten in Ihrer letzten Abfrage berechnen , wie folgt:

Select c.* 
    , (M_Marketing + S_Sales + U_Utilization + No_NoDepartment) as TotalDepartmentsCount 
    , t.ID 
From CTE c (nolock) 
+0

Dies wird nicht funktionieren. Ich muss die Werte in jeder einzelnen Fallspalte summieren. – enigma6205

+0

@ enigma6205 Führen die verschiedenen Fälle, die Sie aufgelistet haben (Abteilung = 'M', 'S', 'U', ''), nicht alle möglichen Abteilungswerte ein? Es könnte hilfreich sein, wenn Sie einige Beispiele für die Zahlen und wie Sie sie addieren möchten. Deine Frage ist nicht ganz klar. –

+0

Gewünschtes Ergebnis zu meiner Frage hinzugefügt. Lesen Sie bitte. – enigma6205

1

Warum nicht einfach die Spalten zusammenfügen, wenn Sie sie berechnet haben? Beispiel:

;WITH CTE 
    AS 
    (
    Select t.ID As [CTE_ID] 
      ,count(distinct case when e.Department='M' then t.ID else null end) as M_Marketing 
      ,count(distinct case when e.Department='S' then t.ID else null end) as S_Sales 
      ,count(distinct case when e.Department='U' then t.ID else null end) as U_Utilization  
      ,count(distinct case when e.Department=' ' then t.ID else null end) as No_NoDepartment 
     From dbo.Table t (nolock) 
      Left Join dbo.ClearedEmployee ce (nolock) ON t.ID = ce.building_fk 
       Join dbo.Employee e (nolock) ON ce.employee_fk = e.employee_pk 
     Group By t.ID 
    ) 

    Select * 
     , t.ID 
     , isnull(M_Marketing, 0) + isnull(S_Sales, 0) + isnull(U_Utilization, 0) + isnull(No_NoDepartment, 0) as TotalDepartments 
    From CTE c (nolock) 
    FULL JOIN dbo.Table t (nolock) ON t.ID=c.[CTE_ID] 
    Order By t.ID ASC; 
Verwandte Themen