在数据透视表中连接列名

Concatenating Column Names in a Pivot

对我来说是新情况。我需要从 table 中旋转 2 列的串联结果。例如,我可以旋转以下内容:

CREATE TABLE #pivSource(
ID INT,
Name VARCHAR(50),
Acronym VARCHAR(20),
[Type] VARCHAR(50)
)

INSERT INTO #pivSource(ID, Name, Acronym, [Type])
SELECT 1, 'Emily','ABC',  'A'
UNION 
SELECT 2, 'Lorenzo','DEF',  'B' 
UNION
SELECT 3, 'Estelle','GHI',  'C'
UNION
SELECT 4, 'Rosie','JKL',  'D'
UNION
SELECT 5, 'Paula','MNO',  'E'
UNION
SELECT 6, 'Rick', 'PQR',  'F'
UNION
SELECT 7, 'Elvira','STU',  'G'
UNION
SELECT 8, 'Eva','VWX',  'H'
UNION
SELECT 9, 'Erick','YZ0',  'I'

SELECT * FROM #pivSource

为您提供以下结果集:

ID  Name    Acronym Type
1   Emily   ABC A
2   Lorenzo DEF B
3   Estelle GHI C
4   Rosie   JKL D
5   Paula   MNO E
6   Rick    PQR F
7   Elvira  STU G
8   Eva VWX H
9   Erick   YZ0 I

我想连接一个数据透视表中的列,这将给出这样的结果集:

ID  ABCA  DEFB   GHIC   JKLD   MNLE   PQRF   STUG   VWXH   YZ0I
1   1     0      0      0      0      0      0      0      0
2   0     1      0      0      0      0      0      0      0        
3   0     0      1      0      0      0      0      0      0    
4   0     0      0      1      0      0  0      0      0
5   0     0      0      0      1      0      0      0      0    
6   0     0      0      0      0      1      0      0      0    
7   0     0      0      0      0      0      1      0      0    
8   0     0      0      0      0      0      0      1      0    
9   0     0      0      0      0      0      0      0      1

本质上我想做这样的事情:

SELECT 
    * 
FROM 
    #pivSource
PIVOT 
    (COUNT(Name)  
    FOR Acronym + [Type] IN(
        [ABC] + [A],
        [DEF] + [B],
        [GHI] + [C],
        [JKL] + [D],
        [MNO] + [E],
        [PQR] + [F],
        [STU] + [G],
        [VWX] + [H],
        [YZ0] + [I])
) AS PivAcrnmType ORDER BY ID;

但是这不起作用,用逗号分隔也不起作用(即 ...FOR Acronym , [Type] IN(...。有什么建议吗?

你尝试过在旋转之前连接吗?

SELECT 
    * 
FROM 
    (select *, Acronym + [Type] as acronym_type
     from #pivSource) p
PIVOT 
    (COUNT(Name)  
    FOR acronym_type IN(
        'ABCA',
        'DEFB',
        'GHIC',
        'JKLD',
        'MNOE',
        'PQRF',
        'STUG',
        'VWXH',
        'YZ0I')
) AS PivAcrnmType ORDER BY ID;

使用子查询或 CTE 连接然后 PIVOT:

SqlFiddle

;WITH cte
AS
(
  SELECT
      Id,
      Name,
      AcronymType =  Acronym + Type
  FROM pivSource
)
SELECT * 
FROM  cte
PIVOT 
(
    COUNT(Name)  
    FOR AcronymType IN(
        [ABCA],
        [DEFB],
        [GHIC],
        [JKLD],
        [MNOE],
        [PQRF],
        [STUG],
        [VWXH],
        [YZ0I])
) AS PivAcrnmType
 ORDER BY ID;