2016-12-20 8 views
2

У меня есть таблица со следующими строками данных.Сравнение строк с другими строками в одной таблице SQL Server

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

, и я хочу, чтобы результирующий набор быть консолидированы Tower & Eng ID и количество положить в соответствующую колонку (Фактурная или не Фактурная) на основе критериев биллинг. Итак, ниже, как конечный набор результатов следует искать выше таблицы:

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

я смог получить 1-ую строку результирующего набора, используя приведенный ниже запрос:

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) 

Однако , пытаясь получить результат второй строки. Мой план состоит в том, чтобы получить две строки через два отдельных запроса, а затем сделать объединение, чтобы объединить результаты.

ответ

2

Одним из методов является условной агрегации:

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

Что это 'gdf.dbo' означает? –

+0

Это соглашение об именах с тремя разделами, используемое в SQL Server. –

1

Попробуйте это:

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

Мы также можем сделать это с помощью OUTER APPLY, как показано ниже:

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 

Простой 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

Этот код даст желаемый результат без какой-либо сложности. Пожалуйста, найдите моментальный снимок вывода из указанного ниже запроса. Надеюсь, я решил вашу проблему. 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 
Смежные вопросы