2016-12-20 4 views
2

Ich habe eine Tabelle mit den folgenden Datenzeilen.Vergleichen von Zeilen mit anderen Zeilen in einer einzelnen SQL Server-Tabelle

EngID Tower Billing Amt 
100  ICS  Y  5000 
100  EDT  Y  7777 
100  ICS  N  2000 

und ich möchte das Ergebnis gesetzt von Tower & Eng ID und die Menge in der entsprechenden Spalte (Fakturierte oder nicht fakturiert) setzen konsolidiert werden basierend auf Abrechnungskriterien. Also, unten ist, wie das Endergebnis Satz für die obige Tabelle aussehen sollte:

EngID Tower Inv Amt (Amt when Billing = Y) Non-Invoiced Amt (Billing=N) 
100  ICS  5000          2000 
100  EDT  7777 

Ich bin in der Lage, die erste Zeile des Ergebnisses unter Verwendung der folgenden Abfrage gesetzt zu bekommen:

Select Temp1.Tower, Temp1. EngID, Temp2.InvoiceAmt as [Inv Amt], Temp1.InvoiceAmt AS [Non-Invoiced Amt] from 
(
SELECT EngID, TOWER,BILLING, InvoiceAmt,RANK() OVER (PARTITION BY EngID, TOWER ORDER BY BILLING) AS RNK 
    FROM [GDF].[dbo].[Sample] ) Temp1 INNER JOIN (SELECT EngID, TOWER,Billing,InvoiceAmt, RANK() OVER (PARTITION BY EngID, TOWER ORDER BY BILLING) AS RNK 
    FROM [GDF].[dbo].[Sample]) Temp2 ON 

    Temp1.EngID = Temp2.EngID 
    AND (Temp1.Tower = Temp2.Tower AND Temp1.Billing < Temp2.Billing) 

jedoch , kämpfen, um das Ergebnis der zweiten Reihe zu erhalten. Mein Plan ist, die zwei Reihen durch zwei getrennte Fragen zu bekommen und dann eine Vereinigung zu machen, um die Resultate zu kombinieren.

Antwort

2

Eine Methode ist, bedingte Aggregation:

select s.engid, s.tower, 
     sum(case when s.billing = 'Y' then amt end) as billing_y, 
     sum(case when s.billing = 'N' then amt end) as billing_n 
from gdf.dbo.sample s 
group by s.engid, s.tower; 
+0

Was ist das 'gdf.dbo' bedeuten? –

+0

Dies ist eine Namenskonvention mit drei Teilen, die in SQL Server verwendet wird. –

1

Try this:

select engid, tower, 
    sum(case when billing = 'Y' then amt end) Inv_amt, 
    sum(case when billing = 'N' then amt end) Non_Inv_amt, 
from my_table 
group by 
    engid, 
    tower; 
0

können wir es auch OUTER wie unter Verwendung gelten:

select A.EngID, 
    sum(A.Amt) as [Inv Amt (Amt when Billing = Y)], 
    sum(B.Amt) as [Non-Invoiced Amt (Billing=N)] 
from #test A 
outer apply(select b.Amt from #test B where A.EngID = b.EngID and b.tower = a.tower and B.Billing = 'n') B 
where a.billing = 'y' 
group by A.EngID, A.Tower 

Einfach LEFT JOIN:

select A.EngID, 
    sum(A.Amt) as [Inv Amt (Amt when Billing = Y)], 
    sum(B.Amt) as [Non-Invoiced Amt (Billing=N)] 
from #test A 
left join #test B on A.EngID = b.EngID 
    and b.tower = a.tower 
    and B.Billing = 'n' 
where a.billing = 'y' 
group by A.EngID, A.Tower 
0

Dieser Code gibt das gewünschte Ergebnis ohne jegliche Komplexität. Bitte finden Sie den Snapshot der Ausgabe von unten genannten Query.Hope Ich habe Ihr Problem gelöst. enter image description here

WITH Mycte 
AS 
(
Select ENGID,Tower,Case When Billing='Y' Then ISNULL(SUM(Amt),0) END AS Inv_Amt, 
Case When Billing='N' Then ISNULL(SUM(Amt),0) END AS Non_Inv_Amt from #Sample 
group by ENGID,Tower,Billing 
) 
Select ENGID,Tower,SUM(Inv_Amt) AS Inv_Amt,SUM(Non_Inv_Amt) AS Non_Inv_Amt from mycte 
group by ENGID,Tower 
Verwandte Themen