Join 水平转换表,需要时填充空列
我有两张桌子Join 水平转换表,需要时填充空列,join,view,null,Join,View,Null,我有两张桌子 命令 和标记 ______________________________ |OrdNum |RowNum| Mark | ------------------------------ |1234 |1 | AB | |1238 |1 | XY | |1238 |2 | XZ | |1745 |1 | KD | |1745
命令 和标记
______________________________
|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 |
------------------------------
对于每个订单,标记表中最多可以有1条到5条对应记录。我需要做一种“水平”连接,在不发生错误的地方使用空值。坦率地说,我甚至不确定这能不能做到。 最终结果应该如下所示
_____________________________________________________
|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(SQLServer2008)中,我尝试了以下连接 为了简化,我们只考虑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…)可能重复的-mark1(m.Mark或NULL)…可能重复的dmitryro感谢您的提示。然而,我的需要是不同的。这五个联接基于相同的两列,但需要使用不同的WHERE子句。正如我在原来的问题中所说,我甚至不知道这是否可能。顺便说一句,我在谈论T-SQL可能与-mark1重复(m.Mark或NULL)…可能与dmitryro重复感谢您的提示。然而,我的需要是不同的。这五个联接基于相同的两列,但需要使用不同的WHERE子句。正如我在原来的问题中所说,我甚至不知道这是否可能。顺便说一下,我正在谈论T-SQL
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