Sql表,加入列值

时间:2013-05-31 00:33:45

标签: sql sql-server tsql

我有一个表格列表,例如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旁边的列名。有没有办法连接它?否则我可以手动添加它,查询对我来说已经足够了。谢谢你。

1 个答案:

答案 0 :(得分:2)

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

这是MAXCASE的一种方式:

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)