我怎样才能得到类似于枢轴 table 的 SQL 结果

How can I get SQL results that resemble a pivot table

我正在尝试从数据库中取回一些结果,它需要以非常具体的方式返回,类似于数据透视表 table 但从我一直在阅读的有关它们的内容来看,我不知道不知道它是否适用,因为我不需要聚合。这是为了在报告中显示 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 完成了所有基于 table 的属性,所以它可以在不编译任何东西的情况下进行修改。

使用 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,但 table 可以重写为:

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

单元可以用同样的方法添加。

谢谢杰森!