2012-04-30 25 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