【发布时间】: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,这并没有真正说明最终游戏是什么。我们按除
quantity和unit之外的所有内容进行分组?这些透视列的名称是什么? -
@Jason - 谢谢,我用你的技术达到了预期的效果!
标签: sql-server tsql sql-server-2005