2012-04-30 26 views
1

我有一張像這樣的表。旋轉員工列

enter image description here

我需要最終的結果只顯示一個記錄每個訂單(主要是結合亞目)。僅總結不同子訂單的收入(訂單0935744,總計575.04 + 31.68)。訂單最多2名員工的

最終的結果應該是這樣可以有:

order  totalrevenue employee1 employee2 
0813700  258.57  CREW  NULL  
0935744  606.72  95liv  95nat 

我使用ROW_NUMBER,做一些加入,但我沒有運氣嘗試。

示例代碼

SELECT N'0813700' AS [OrderNum], N'1077980' AS [SubOrder], N'CREW' AS [employeeid], N'258.57' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95LIV' AS [employeeid], N'575.04' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95LIV' AS [employeeid], N'31.68' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95NAT' AS [employeeid], N'575.04' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95NAT' AS [employeeid], N'31.68' AS [revenue] 
+1

每個目可以有不同的員工ID,所以如何你想要多少列?每個訂單有多少員工是否有限制? – joshp

+0

是的,限額是2. – Gabe

回答

0

這個怎麼樣? (從OP意見後修訂)

假設:每個訂單

  1. 沒有兩個以上的員工。
  2. 每亞目一個員工(如在實施例)
  3. 收入爲子順序一致地重複對行(每例子)

代碼示例

select order, sum(revenue) as totalrevenue, max(employee1) as employee1, 
case 
    when max(employee1) = max(employee2) then null 
    else max(employee2) 
end as employee2 
from (
    select order, suborder, max(revenue) as revenue, max(employeeid) 
    from orders 
    group by order, suborder 
) SubOrderTotal 
group by order 

亞目一般來說,我不會推薦對兩名員工進行嚴格的轉換或者對子訂單收入進行重複。在處理真實世界的數據時,做出這樣嚴格的假設通常會導致錯誤。但是,我不知道你的數據。

+0

總計總收入並沒有給出訂單0935744的正確金額(606.72)。 – Gabe

+0

我明白了。我誤解了那部分。 – joshp

0

這應該給你正在尋找的結果是:

create table #temp 
(
    ordernum int, 
    suborder int, 
    employeeid varchar(50), 
    revenue money 
) 

insert into #temp values(0813700, 1077980, 'CREW', 258.57) 
insert into #temp values(0935744, 1257060, '95LIV', 575.04) 
insert into #temp values(0935744, 1342944, '95LIV', 31.68) 
insert into #temp values(0935744, 1257060, '95NAT', 575.04) 
insert into #temp values(0935744, 1342944, '95NAT', 31.68) 

select ordernum 
    , sum(revenueperorder) as total 
    , employee1 
    , case when employee1 = employee2 then null else employee2 end as employee2 
from 
(
    select ordernum 
     , revenue as revenueperorder 
     , min(employeeid) as employee1 
     , max(employeeid) as employee2 
    from #temp 
    group by ordernum, revenue 
) x 
group by ordernum, employee1, employee2 

drop table #temp 

Results: 

813700 258.57 CREW NULL 
935744 606.72 95LIV 95NAT 
0
DECLARE @SubOrder TABLE 
(
    OrderNum INT NOT NULL, 
    SubOrder INT NOT NULL, 
    EmployeeID NVARCHAR(50) NOT NULL, 
    Revenue  NUMERIC(10, 2) NOT NULL 
); 

INSERT @SubOrder (OrderNum, SubOrder, EmployeeID, Revenue) 
SELECT N'0813700' AS [OrderNum], N'1077980' AS [SubOrder], N'CREW' AS [employeeid], N'258.57' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95LIV' AS [employeeid], N'575.04' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95LIV' AS [employeeid], N'31.68' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1257060' AS [SubOrder], N'95NAT' AS [employeeid], N'575.04' AS [revenue] UNION ALL 
SELECT N'0935744' AS [OrderNum], N'1342944' AS [SubOrder], N'95NAT' AS [employeeid], N'31.68' AS [revenue]; 

SELECT pvt.OrderNum, 
     pvt.TotalRevenue, 
     pvt.[1] AS Emp1, 
     pvt.[2] AS Emp2 
FROM 
(
     SELECT dt.OrderNum, 
       dt.EmployeeID, 
       DENSE_RANK() OVER(PARTITION BY dt.OrderNum ORDER BY dt.EmployeeID) AS Rnk, 
       SUM(dt.Revenue) OVER(PARTITION BY dt.OrderNum) AS TotalRevenue 
     FROM 
     (
       SELECT so.OrderNum, 
         so.EmployeeID, 
         ROW_NUMBER() OVER(PARTITION BY so.OrderNum, so.SubOrder ORDER BY @@SPID) AS RowNum, 
         so.Revenue 
       FROM @SubOrder so 
     ) dt 
     WHERE dt.RowNum = 1 
) src 
PIVOT (MAX(src.EmployeeID) FOR src.Rnk IN ([1], [2])) pvt 

結果:

OrderNum TotalRevenue Emp1 Emp2 
-------- ------------ ------ ----- 
813700 258.57  CREW NULL 
935744 606.72  95LIV 95NAT 

中間結果(...) src

OrderNum EmployeeID Rnk TotalRevenue 
-------- ---------- --- ------------ 
813700 CREW  1 258.57 
935744 95LIV  1 606.72 
935744 95NAT  2 606.72 

中間結果(...) dt

OrderNum EmployeeID RowNum Revenue 
-------- ---------- ------ ------- 
813700 CREW  1  258.57 
935744 95LIV  1  575.04 
935744 95NAT  2  575.04 
935744 95NAT  1  31.68 
935744 95LIV  2  31.68 
+0

這並不能爲訂單號935744提供正確的總收入。 – wickedone

+0

這個總數是正確的。對於OrderNum = 935744,您的數據具有下列值:** 575.04 **,_31.68_,** 575.04 **,_31.68_。因此,OrderNum = 935744的總收入是1213,44。如果你願意,你可以刪除第4和第5行,因爲它們是重複的。 –

+0

@wickedrunr:我修改了腳本,以便刪除重複項。 –

0

到目前爲止的答案需要與employee1 & 2硬編碼的支點定義爲支點的實體,淡然的,如果你的數據是動態的,我想像你將有不同數量的員工(和因此需要不同數量的列)?如果是的話,我建議你採用混合動態SQL /樞軸例子如:

Pivot Table and Concatenate Columns

或本:

PIVOT in sql 2005