我正试图取消如下所示的查询集
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
答案 0 :(得分:0)
在PostgreSQL中,您可以将列转换为数组,然后取消嵌套(爆炸):
select MemberID, unnest(array[N1code, N2code, N3code]) as Codes, Name
from table
答案 1 :(得分:0)
在SQL Server中,它只是一个简单的UNPIVOT
。无需使用CASE
语句,因为原始列名返回到UNPIVOT
中。我们只需要从原始列名称中拉出左2个字符即可。如果您希望它不是列名的派生名称,则必须使用CASE
。
查看最外面的选择以查看那些选择的列来自何处。
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和更低版本,可以使用CROSS JOIN
和几个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