水平变换表格,需要时填充NULL列

我有两张桌子
命令

_____________________
|OrdNum     |Stockid |
----------------------
|1234       |alpha   |  
|1238       |beta    | 
|1745       |gamma   |  
----------------------

和MARKS

______________________________
|OrdNum     |RowNum|   Mark  |
------------------------------
|1234       |1     |   AB    | 
|1238       |1     |   XY    |    
|1238       |2     |   XZ    |   
|1745       |1     |   KD    |    
|1745       |2     |   KS    |    
|1745       |3     |   JJ    |     
|1745       |4     |   RT    |     
|1745       |5     |   PJ    |   
------------------------------

对于每个订单,MARKS表中最多可以有1到最多5个对应的记录。
我需要做一些“水平”连接,其中没有相应的NULL值。 坦率地说,我甚至不确定它可以做到。 最终的结果应该如下所示

_____________________________________________________
|OrdNum     |Mark1  |Mark2  |Mark3  |Mark4  |Mark5  |
-----------------------------------------------------
|1234       |AB     |NULL   |NULL   |NULL   |NULL   | 
|1238       |XY     |XZ     |NULL   |NULL   |NULL   |    
|1238       |KD     |KS     |JJ     |RT     |PJ     |   
-----------------------------------------------------

再次,最后的观点必须是水平的,5(加上订单号)列。 有人知道这是可能的吗? 先谢谢你。


在T-SQL(SQL Server 2008)中,我尝试了下面的连接为了简化起见,我们只考虑2列而不是5。

SELECT o.OrdNum, 
m1.Mark AS MARK1,
m2.Mark AS MARK2,
FROM ORDERS o 
LEFT JOIN MARKS m1 ON o.OrdNum = m1.OrdNum WHERE m1.RowNum=1
LEFT JOIN MARKS m2 ON o.OrdNum = m2.OrdNum WHERE m2.RowNum=2

这是综合错误的。
所以我修改了连接,如下所示

SELECT o.OrdNum, 
m1.Mark AS MARK1,
m2.Mark AS MARK2,
FROM ORDERS o 
LEFT JOIN MARKS m1 ON o.OrdNum = m1.OrdNum 
LEFT JOIN MARKS m2 ON o.OrdNum = m2.OrdNum 
WHERE m1.RowNum=1 AND m2.RowNum=2

这不是我想要得到的,因为它不会产生只有与第一个RowNum对应的记录的订单(在本文开头的值,它不会显示订单号1234 ..)

链接地址: http://www.djcxy.com/p/76297.html

上一篇: Transform a table horizontally, with filling NULL columns when needed

下一篇: Add NOT NULL to a column in SQL