首页 > 解决方案 > 非透视场景sql中的case语句

问题描述

我正在尝试取消旋转查询集,如下所示

Member ID   N1code  N2code  N3code  Name 
1234        234     567     878     ted 
23344       4242    23232           Mike 

我想要某种类型的案例陈述,以帮助在取消透视后显示类型

MemberID Codes  Name    Type 
1234     234    ted     N1
1234     567    ted     N2
1234     878    ted     N3
23344    4242   Mike    N1
23344   23232   Mike    N2

标签: sqlcaseunpivot

解决方案


在 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 及更低版本,您可以使用 aCROSS 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

推荐阅读