我有一个表格列表,例如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旁边的列名。有没有办法连接它?否则我可以手动添加它,查询对我来说已经足够了。谢谢你。
答案 0 :(得分:2)
假设您知道array1_nbr列的可能值的数量,那么您可以PIVOT结果。
这是MAX
和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)