【问题标题】:sql server pivot multiple fields by two columnssql server 按两列旋转多个字段
【发布时间】:2018-07-30 06:07:08
【问题描述】:

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

我尝试在 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(或其他运算符)是否可行,并提供帮助说明如何使用它。非常感谢。

【问题讨论】:

    标签: sql-server pivot


    【解决方案1】:

    为什么不能使用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

    【讨论】:

    • 谢谢,问题是,我没有具体说明问题,但是这些事实表真的很乱,他们每个月制作一个,列数是可变的,有些有 48,有些有 50 等等。只有此处显示的列始终存在。所以我正在尝试制定一个通用的解决方案来整合我感兴趣的值,并避免按 40、41、42 个字段进行分组。
    • 听起来您需要动态构建查询?如果是这样,同样的逻辑仍然适用。您是否正在寻找有关如何构建动态查询的答案?
    • 好的,我认为动态是不可能的,因为我事先不知道列名是什么。但是我可以使用您的建议来构建一个仅包含我感兴趣的值的临时表。然后将其与主表内部连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多