首页 > 解决方案 > 如果一列不为空,则转换为多列的行

问题描述

我有一个像下面这样的表,我希望将 col4 col5 和 col6 转换为行,但是以我在下面列出的特定模式

col1 col2 col3 col4 col5 col6
一种 b C 500 200
w X 是的 1000 300
z G H 200 600

我想将其转换为以下

col1 col2 col3 col4 col5 col6
一种 b C 500
一种 b C 200
w X 是的 1000
w X 是的 300
z G H 200
z G H 600

我正在尝试使用 unpivot 但无法获得所需的结果

基本上,如果在其中一个列中找到空值,例如 col4 中的第一条记录,则 SQL 查询应忽略具有空值的 col4,但将 abc col5 (500) 转换为一行加上 abc col6 (200) 到另一行

标签: sqlsql-servertsqlunpivotunion-all

解决方案


您可以使用apply然后过滤掉所有NULL值:

select t.col1, t.col2, t.col3, v.*
from t cross apply
     (values (col4, null, null), (null, col5, null), (null, null, col6)
     ) v(col4, col5, col6)
where v.col4 is not null or v.col5 is not null or v.col6 is not null;

推荐阅读