我有一张这样的桌子。
我需要最终结果只显示每个订单的一条记录(基本上是组合子订单)。仅汇总不同子订单的收入(订单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]
答案 0 :(得分:0)
这个怎么样? (在OP评论后修改)
假设:
代码示例
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
一般情况下,我不建议对两名员工进行严格转换或重复子订单收入。在处理现实世界数据时,做出如此严格的假设通常会导致错误。但是,我不知道你的数据。
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
到目前为止,答案需要一个带有employee1&的硬编码轴。如果您的数据是动态的,我认为您将拥有不同数量的员工(因此需要不同数量的列)?如果是这样,我建议您采用混合动态SQL / Pivot示例,例如:
Pivot Table and Concatenate Columns
或者这个: