sql server通过两列透视多个字段

时间:2018-07-30 06:07:09

标签: sql-server pivot

在SQL Server 2012中给了我一个混乱的“事实”表,其中以OrderId和ProductId为键。相同的OrderId可以具有多个ProductId(最多5行)。出于报告目的,我只需要使用来自Ask,Buy,Rec,Pen,Ret等5个字段的最大值,为每个OrderId + ProductId组合保留一行。

我尝试在ProductId上使用数据透视运算符,但不知道如何从5个不同的字段中获取最大值。

样本数据:

DROP TABLE #tmpSO;

CREATE TABLE #tmpSO
(OrderId INT, ProductId INT, Ask INT, Buy INT, Rec INT, Pen INT, Ret INT);

INSERT INTO #tmpSO (OrderId, ProductId, Ask, Buy, Rec, Pen, Ret)
VALUES
(67,1,2,0,0,2,0),
(67,4,30,0,0,30,0),
(67,4,0,30,0,30,0),
(67,6,20,0,0,0,0),
(67,6,0,20,0,0,0),
(67,6,0,0,20,0,0),
(67,9,30,0,0,0,0),
(67,9,0,30,0,0,0),
(67,9,0,0,25,0,0),
(67,9,0,0,0,5,0);

SELECT * FROM #tmpSO;

OrderId ProductId   Ask Buy Rec Pen Ret
67      1           2   0   0   2   0
67      4           30  0   0   30  0
67      4           0   30  0   30  0
67      6           20  0   0   0   0
67      6           0   20  0   0   0
67      6           0   0   20  0   0
67      9           30  0   0   0   0
67      9           0   30  0   0   0
67      9           0   0   25  0   0
67      9           0   0   0   5   0

我想要的结果是:

OrderId ProductId   Ask Buy Rec Pen Ret
67      1           2   0   0   2   0
67      4           30  30  0   30  0
67      6           20  20  20  0   0
67      9           30  30  25  5   0

请告知使用Pivot(或其他运算符)是否可行,并提供有关如何使用它的帮助。非常感谢。

1 个答案:

答案 0 :(得分:2)

您为什么不能使用GROUP BYMAX()

它将给出您预期的结果:

select orderid, productid, MAX(ask) ask, MAX(buy) as buy, MAX(rec) as rec, MAX(pen) as pen, MAX(ret) as ret
from #tmpso 
group by orderid, productid
order by orderid, productid

工作副本here