水平转换表,并在需要时填充NULL列

时间:2016-07-14 09:25:10

标签: join view 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 ..)< / p>

0 个答案:

没有答案