非透视场景sql中的Case语句
我正在尝试取消透视查询集,如下所示非透视场景sql中的Case语句,sql,case,unpivot,Sql,Case,Unpivot,我正在尝试取消透视查询集,如下所示 Member ID N1code N2code N3code Name 1234 234 567 878 ted 23344 4242 23232 Mike 我想要一个case语句,它可以帮助在取消激活后显示类型 MemberID Codes Name Type 1234 234 ted N1 1234 567 ted
Member ID N1code N2code N3code Name
1234 234 567 878 ted
23344 4242 23232 Mike
我想要一个case语句,它可以帮助在取消激活后显示类型
MemberID Codes Name Type
1234 234 ted N1
1234 567 ted N2
1234 878 ted N3
23344 4242 Mike N1
23344 23232 Mike N2
在PostgreSQL中,您可以将列转换为数组,然后取消测试(分解):
在SQL Server中,它只是一个简单的
UNPIVOT
。不需要使用CASE
语句,因为原始列名会在UNPIVOT
中返回。我们只需从原始列名中提取左2个字符。如果希望它不是列名的派生项,则必须使用大小写
查看最外层的select以查看这些选定列的来源
SELECT unpiv.MemberID, unpiv.Name, unpiv.theCode, left(codes,2) AS theType
FROM
(
SELECT MemberID, Name, N1Code, N2Code, N3Code
FROM t1
) AS src
UNPIVOT
(
theCode FOR codes IN (N1Code, N2Code, N3Code)
) AS unpiv;
对于MySQL 5.x及更低版本,您可以使用交叉连接
和几个CASE
语句
SELECT t1.MemberID, t1.Name
, CASE cj.colName
WHEN 'N1Code' then t1.N1Code
WHEN 'N2Code' then t1.N2Code
WHEN 'N3Code' then t1.N3Code
END AS theCode
, CASE cj.colName
WHEN 'N1Code' then 'N1'
WHEN 'N2Code' then 'N2'
WHEN 'N3Code' then 'N3'
END AS theType
FROM t1
CROSS JOIN
(
SELECT 'N1Code' AS colName
UNION ALL
SELECT 'N2Code'
UNION ALL
SELECT 'N3Code'
) cj
SQL的风格和版本是什么?可能重复的
类型
来自N(x)code
列名,只有前两个字符我将其编辑掉,因为它应该是对问题的注释,而不是答案谢谢!我用交叉应用函数解决了这个问题。
SELECT t1.MemberID, t1.Name
, CASE cj.colName
WHEN 'N1Code' then t1.N1Code
WHEN 'N2Code' then t1.N2Code
WHEN 'N3Code' then t1.N3Code
END AS theCode
, CASE cj.colName
WHEN 'N1Code' then 'N1'
WHEN 'N2Code' then 'N2'
WHEN 'N3Code' then 'N3'
END AS theType
FROM t1
CROSS JOIN
(
SELECT 'N1Code' AS colName
UNION ALL
SELECT 'N2Code'
UNION ALL
SELECT 'N3Code'
) cj