2016-08-09 189 views
0

Ich habe den folgenden Code und die folgende Abfrage, die in SQL Server Management Studio 2012 geschrieben wird;Übersetzen von SUMMIF zu TSQL

WITH cteUniqueClients AS 
(
    SELECT 
     CASE 
      WHEN ServiceActualEndDate IS NULL 
       AND LAG(ClientID,1) OVER(PARTITION BY ClientID, ServiceProvider ORDER BY ServiceActualEndDate DESC, StartDateFormatted DESC) = ClientID 
       THEN 0 
      WHEN ServiceActualEndDate IS NOT NULL 
       THEN 0 
      ELSE 1 
     END AS UniqueClient, 
     CASE 
      WHEN LAG(ActualHoursPerWeek,1) OVER (PARTITION BY ClientID, ServiceProvider ORDER BY StartDateFormatted DESC) = ActualHoursPerWeek 
       THEN 0 
       ELSE 1 
     END AS UniqueService, 
     ClientID, ClientName, 
     ActualHoursPerWeek, 
     ServicePlannedStartDate, ServiceActualStartDate 
    FROM 
     dbo.tTable1 
    WHERE 
     (ServiceActualStartDate <= '2016-08-09' OR ServicePlannedStartDate <= '2016-08-09') 
     AND ServiceActualEndDate IS NULL 
     AND (ServicePlannedEndDate > '2016-08-09' OR ServicePlannedEndDate IS NULL) 
     AND ClientDeathDate IS NULL   
) 
SELECT 
    COUNT(ClientID) OVER (PARTITION BY ClientID ORDER BY ClientID) AS RecordCount, 
    cteUniqueClients.* 
FROM 
    cteUniqueClients 
WHERE 
    UniqueService = 1 
ORDER BY 
    ClientID ASC 

und die folgende Excel-Formel:

=SUMIF(G2:G961,G2,I2:I961) 

Wo Spalte G ClientID wäre und Spalte würde ich ActualHoursPerWeek sein.

Gibt es eine Möglichkeit, diese beiden zu heiraten, während alle Berichtsspalten beibehalten werden?

Unten ist ein Bild der Beispiel-Excel-Ausgabe, die gewünscht werden würde;

Updated Excel Output

+0

Was möchten Sie mit der 'SUMMIF' erreichen? Es sieht so aus, als würde man 'ActualHoursPerWeek' für die' ClientID' von dieser Zeile und allen unteren Zeilen (höhere Zeilen ausgeschlossen) hinzufügen. Wenn also "ClientID" in den Zeilen 1-3 gleich ist, würde Zeile 1 die Summe von 1-3 erhalten, Zeile 2 würde die Summe von 2-3 erhalten und Zeile 3 würde sich selbst erhalten. (Angenommen, die Formel wurde in einer Zelle erstellt und kopiert.) – SMM

+0

@SMM Genau so hat die Excel-Datei die Ergebnisse ja. Ich kann dann die Daten nach ClientID und AcutalHoursPerWeek sortieren und die eindeutige Client-Spalte verwenden und nur die eindeutigen Clients anzeigen, aber auch die gesamten Stunden. Sorry, wenn das ein bisschen wortreich ist – NHier1992

+0

So würde ich dann erwarten, dass das Originalblatt eine sehr spezifische Sortierreihenfolge haben, um sicherzustellen, dass die Summen nur niedrigere Zeilen enthalten ... Was ist diese Sortierreihenfolge? Sind diese Spalten in der Tabelle enthalten? Es kann hilfreich sein, das Quell-Excel zu sehen, mit dem Sie das gewünschte Ausgabebild erstellt haben. Vielleicht auch das Tabellenschema. – SMM

Antwort

0

Sorry ... anstrengender Tag :-) Als jemand gepostet oben Ich glaube, es gibt Möglichkeiten, dies zu tun. Aber ich denke, der Schlüssel hier ist, dass Sie auf Ihre Bestellungen achten. Ich habe den folgenden Code geschrieben, der Sie mit Vorbehalten versorgt. Ich habe meinen Testtisch aufgenommen.

declare @tbl table (
Ident     int identity (1,1), 
RecordCount    int, 
UniqueClient   int, 
ClientID    int, 
ClientName    varchar(20), 
ActualHoursPerService float 
); 

insert into @tbl values 
(1,1,1,'Pam',18.75), 
(1,1,2,'Collin',8.75), 
(1,1,3,'William',19.83), 
(1,1,4,'Andy',10), 
(5,0,5,'James',1.19), 
(5,0,5,'James',1.75), 
(5,0,5,'James',2.31), 
(5,0,5,'James',3.5), 
(5,0,5,'James',7), 
(1,1,6,'Ford',12) 

select * from @tbl order by ClientID; 

select sum(t.ActualHoursPerService) over (partition by t.ClientID order by t.Ident desc rows unbounded preceding) HoursPerClient 
     ,* 
from @tbl t 
order by t.ClientID, t.Ident; 

Sie werden feststellen, dass ich eine Ident Spalte in meiner Quelltabelle erstellt (was Ihr CTE sein würde. Andernfalls werden die Zeilen für James aus der Ordnung sein kann, und dann werden Sie mit jeder Zeile unterschiedlich laufenden Summen haben. Sie hier ist eine Liste von Möglichkeiten, soll wohl auch so etwas wie ServiceActualEndDate als Ihr Auftrag von in der Partition Anweisung und verwendet, die in der endgültigen Bestellung abholen.

als Referenz laufender Summen zu tun, die ich in eine Rück gemacht laufenden Summe Passen Sie an, was Sie suchen: link

Hoffe, das ist genug, um Sie dorthin zu bringen!

+0

Danke für die ausführliche Antwort. Ich werde das später noch einmal ausprobieren und mit den Ergebnissen auf Sie zurückkommen. – NHier1992