【问题标题】:How can I get SQL results that resemble a pivot table如何获得类似于数据透视表的 SQL 结果
【发布时间】:2018-02-09 20:28:14
【问题描述】:

我正在尝试从数据库中取回一些结果,它需要以非常特定的方式返回,类似于数据透视表,但从我一直在阅读的关于它们的内容来看,我不知道它是否适用我不需要聚合。这是为了在报表中显示 RFQ 信息。数据库结构比较复杂,我用一个简化的例子。

RFQ table
----------------
RFQID  |  Requestor
----------------
555    |  789
777    |  789

Item table
--------------------------
RFQID  |  Line  |  ItemID
--------------------------
555    |  1     |  P07
777    |  1     |  P07

ItemQuantity table
------------------------------------
RFQID  |  Line  |  Quantity  |  Unit
------------------------------------
555    |  1     |  5         |  In
555    |  1     |  10        |  In
555    |  1     |  15        |  In
777    |  1     |  30        |  In
777    |  1     |  50        |  In

Vendor table
-----------------------------
RFQID  |  Line  |  VendorID
-----------------------------
555     |  1     |  Speedy
777     |  1     |  SlowPoke

所以如果我输入这样的查询:

SELECT M.RFQID, Requester, I.Line, ItemID, Quantity, Unit, VendorID
    FROM RFQ M
        JOIN Item I ON M.RFQID = I.RFQID 
        JOIN Vendor V ON I.Line = V.Line AND I.RFQID = V.RFQID
        JOIN ItemQuantity IQ ON IQ.Line = V.Line AND IQ.RFQID = V.RFQID
WHERE ItemID IN ('P07', 'P08')
ORDER BY M.RFQID DESC

这将产生:

555  |  789  |  1  |  P07  |  5  |  In  |  Speedy
555  |  789  |  1  |  P07  |  10 |  In  |  Speedy
555  |  789  |  1  |  P07  |  15 |  In  |  Speedy
777  |  789  |  1  |  P07  |  30 |  In  |  SlowPoke
777  |  789  |  1  |  P07  |  50 |  In  |  SlowPoke

我需要得到:

RFQID| Requestor | Line | ItemID | Quantity row1 | Unit row1 | Quantity row2 | Unit row2 | Quantity row3 | Unit row3 | VendorID
555  |  789      |  1   |  P07   |  5            |  In       |  10           |       In  |  15           |  In       |  Speedy
777  |  789      |  1   |  P07   |  30           |  In       |  50           |       In  |  NULL         |  NULL     |  SlowPoke

这可能吗?我知道我可以使用光标编写 SP,但我希望尽可能避免使用该路线。

编辑:这是报告的一部分: 1)全公司使用 2) 由 14 个数据集组成 3) 如此定制,以至于我怀疑是否有可以制作它的报告作者。 4) 它存在于我们希望摆脱的 Access 2003 中 5) 我几乎完成了所有基于属性表的 PrintDocument 的所有工作,因此无需编译任何内容即可对其进行修改。

【问题讨论】:

  • 您是如何得出最终结果的?您能否标记列,以便我了解您要构建的内容?因为你试图在关系格式和最终版本之间进行什么转换对我来说没有意义
  • @John you're PIVOT 是要走的路——您可以在不真正聚合数据的情况下使用 PIVOT,只需在数量字段周围使用 MAX()。如果数量的值并不总是相同,则需要使用动态数据透视表
  • @Xedni 5/10/15 的值似乎来自 itemquantity 表
  • 感谢@Eli,这并没有真正说明最终游戏是什么。我们按除quantityunit 之外的所有内容进行分组?这些透视列的名称是什么?
  • @Jason - 谢谢,我用你的技术达到了预期的效果!

标签: sql-server tsql sql-server-2005


【解决方案1】:

使用 Jason 的技术,我能够产生正确的输出。

SELECT M.RFQID, Requester, I.Line, ItemID, Qty1, Qty2, Qty3, VendorID
    FROM RFQ M
        JOIN Item I ON M.RFQID = I.RFQID 
        JOIN Vendor V ON I.Line = V.Line AND I.RFQID = V.RFQID
        JOIN (SELECT RFQID, LineItem, MAX(CASE WHEN QtyID = 1 THEN QUANTITY END) AS Qty1, MAX(CASE WHEN QtyID = 2 THEN QUANTITY END) AS Qty2, MAX(CASE WHEN QtyID = 3 THEN QUANTITY END) AS Qty3
                FROM ItemQuantity 
                GROUP BY RFQID, Line) IQ ON IQ.Line = I.Line AND IQ.RFQID = M.RFQID             
    WHERE ItemID IN ('P07', 'P08')
    ORDER BY M.RFQID DESC

结果

RFQID| Requestor | Line | ItemID | Quantity row1 | Quantity row2 | Quantity row3 | VendorID
555  |  789      |  1   |  P07   |  5            |  10           |  15           |  Speedy
777  |  789      |  1   |  P07   |  30           |  50           |  NULL         |  SlowPoke

虽然我的演示数据不包含 QtyID,但该表可以重写为:

ItemQuantity table
----------------------------------------------
RFQID  |  Line  |  QtyID  |  Quantity  |  Unit
----------------------------------------------
555    |  1     |  1      |  5         |  In
555    |  1     |  2      |  10        |  In
555    |  1     |  3      |  15        |  In
777    |  1     |  1      |  30        |  In
777    |  1     |  2      |  50        |  In

可以以相同的方式添加单位。

谢谢杰森!

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2022-06-29
    • 2010-11-07
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多