取消透视方案sql中的case语句

时间:2018-07-18 18:47:40

标签: 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     N2
1234     878    ted     N3
23344    4242   Mike    N1
23344   23232   Mike    N2

2 个答案:

答案 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