0

我有一个表格列表,例如 A、B C。

我不知道有多少列,也不知道这些表的所有列名。

我对每个表的了解是键名和我想要组合的列。

表的典型 DDL 将是:

CREATE TABLE [dbo].[G_bHQ_S1](
[Key_code] [nvarchar](255) NULL,
[array1_nbr] [int] NULL,
[fDSHhldDetails] [int] NULL,
[fRespName] [nvarchar](200) NULL,
[fStoreAge] [int] NULL,
[qSex] [int] NULL,
[qDOB] [datetime] NULL,
[qDOBNR] [int] NULL,
[qAge] [int] NULL,
[qAgeNR] [int] NULL,
[qAgeRange] [int] NULL,
[qAge15OrOver] [int] NULL
) ON [PRIMARY]

为前三列存储的数据将类似于:

Key_code            array1_nbr  fDSHhldDetails      ........
W801053126H001  11          11                  ........
W802078001H001  11          11                  ........  
W802078012H001  11          11                  ........                  
W802078012H001  12          12                  ........  
W802078022H001  11          11                  ........  
W802078022H001  12          12                  ........  
........................................................

每个表只有一列我想组合,它总是 array1_nbr。

对于每个唯一的 Key_code,我需要将 array1_nbr 的值与其右下一列的列名结合起来。

因此,上述数据集的结果集将是:

Key_code                fDSHhldDetails_11     fDSHhldDetails_12     ........
W801053126H001          11                        null                  ........
W802078001H001          11                        null                  ........  
W802078012H001          11                        12                    ........                  
W802078022H001          11                        12                    ........  
....................................................................................

你能帮我解决这个问题吗?

谢谢。

@sgeddes 的结果集:

Key_code                11                        12                ........
W801053126H001          11                        null              ........

我期望的列名是 fDSHhldDetails_11 和 fDSHhldDetails_12。并且 fDSHhldDetails 对于每个表都是未知的,但它是 array1_nbr 旁边的列名。有没有办法连接它?否则我可以手动添加它,查询对我来说已经足够好了。多谢了。

4

1 回答 1

2

假设您知道 array1_nbr 列的可能值的数量,那么您可以 PIVOT 结果。

这是使用MAXand的一种方法CASE

SELECT Key_Code,
  MAX(CASE WHEN array1_nbr = 11 THEN fDSHhldDetails END) fDSHhldDetails11,
  MAX(CASE WHEN array1_nbr = 12 THEN fDSHhldDetails END) fDSHhldDetails12
FROM YourTable
GROUP BY Key_Code

这是一个PIVOT

SELECT Key_Code, [11] fDSHhldDetails11, [12] 
FROM 
(
  SELECT Key_Code, array1_nbr
  FROM YourTable) p
PIVOT
(
  MAX(array1_nbr)
  FOR array1_nbr IN
  ( [11], [12] )
) pvt;

或者,如果您不知道列数,请考虑使用Dynamic SQL.

这是那个例子:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(array1_nbr) 
            FROM YourTable c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT Key_code, ' + @cols + ' 
              FROM 
              (
                SELECT Key_Code, array1_nbr
                FROM YourTable
               ) p
              PIVOT 
              (
                 MAX(array1_nbr)
                 for array1_nbr in (' + @cols + ')
              ) p '


EXECUTE(@query)
于 2013-05-31T00:56:46.853 回答