2017-10-09 46 views
3

我有这样串联值插入行

ID Qusetion_NO answer 
001  1   a 
001  2   b 
001  4   c 
002  1   d 
002  2   e 
002  3   f 
002  4   g 

我需要B柱和C把它变成一个行数据。 这将非常落得像:

ID  1 2 3 4 
001 a b  c 
002 d e f g 

我如何使用MS-SQL这个表? 在此先感谢。

+0

有没有总是最多4个答案,或者是号码动态? –

+0

总是4个答案! –

回答

3

您可以对此使用条件聚合。

select ID 
    , max(case when Question_NO = 1 then answer end) as [1] 
    , max(case when Question_NO = 2 then answer end) as [2] 
    , max(case when Question_NO = 3 then answer end) as [3] 
    , max(case when Question_NO = 4 then answer end) as [4] 
FROM YourTable 
group by ID 
3

您可以使用PIVOT来制作它。

DECLARE @T TABLE (ID VARCHAR(3), Qusetion_NO INT, answer VARCHAR(3)) 

INSERT @T 
VALUES 
('001',1,'a'), 
('001',2,'b'), 
('001',4,'c'), 
('002',1,'d'), 
('002',2,'e'), 
('002',3,'f'), 
('002',4,'g') 

SELECT * FROM 
    (SELECT * FROM @T) SRC 
     PIVOT(MAX(answer) 
      FOR Qusetion_NO IN([1], [2], [3], [4])) PVT 

结果:

ID 1 2 3 4 
---- ---- ---- ---- ---- 
001 a b NULL c 
002 d e f g 
+0

你不需要在这里使用子查询。 –

+0

也许这个查询不需要子查询,但我更喜欢使用这个约定。这是我的方式 –

+0

好的。对我来说,它只是使代码更复杂,没有任何好处。 –

0

您也可以尝试:

SELECT ID, 
     ISNULL(CONVERT(NVARCHAR(MAX), MAX(CASE 
              WHEN Qusetion_NO = 1 
              THEN answer 
             END)), '') AS [1], 
     ISNULL(CONVERT(NVARCHAR(MAX), MAX(CASE 
              WHEN Qusetion_NO = 2 
              THEN answer 
             END)), '') AS [2], 
     ISNULL(CONVERT(NVARCHAR(MAX), MAX(CASE 
              WHEN Qusetion_NO = 3 
              THEN answer 
             END)), '') AS [3], 
     ISNULL(CONVERT(NVARCHAR(MAX), MAX(CASE 
              WHEN Qusetion_NO = 4 
              THEN answer 
             END)), '') AS [4] 
FROM <table_name> 
GROUP BY ID; 

所需的输出:

ID  1 2 3 4 
001 a b  c 
002 d e f g