【问题标题】:TSQL-Select - Turn multiple Rows into single RowTSQL-Select - 将多行变成单行
【发布时间】:2016-10-13 07:13:28
【问题描述】:

我必须处理下面的表结构,其中列存储为行:

CREATE TABLE Test 
    (
     ID varchar(10), 
     RowNumber int, 
     Column1 varchar(200), -- sheet name
     Column2 varchar(200), -- column name
     Column3 varchar(200)  -- column cell value
    );

INSERT INTO Test
(ID, RowNumber,Column1,Column2, Column3)
VALUES
('ID0001', 1, 'sheet abc','InternalNumber','2016_2923_2321'),
('ID0001', 2, 'sheet abc','Customer','ACME'),
('ID0001', 3, 'sheet abc','Project','ABC_Project'),
('ID0001', 4, 'another sheet name','Subject','New Model'),
('ID0001', 5, 'another sheet name','SOP','2016'),
('ID0001', 6, 'another sheet name','EOP','2022')

我设法将行转换为适当的列(请参阅底部的 fiddle),但我不想将数据放入一行,因为Column2 中的每个值都是一个唯一的名称。

在下图中顶部是输入表,第二个是我拥有的,第三个是我想要的输出,我无法工作:

另见我的fiddle

希望你能帮我解决这个问题。

提前谢谢你。

【问题讨论】:

  • 您能否将所需的结果粘贴为文本,图像在许多域中被阻止

标签: sql-server sql-server-2008 tsql pivot


【解决方案1】:

基本的方式是使用PIVOT:

SELECT *
FROM (
    SELECT  ID,
            Column2, 
            Column3
    FROM #Test
) as t
PIVOT (
    MAX(Column3) FOR Column2 IN ([InternalNumber],[Customer],[Project],[Subject],[SOP],[EOP])
) as p

输出:

ID      InternalNumber  Customer    Project     Subject     SOP     EOP
ID0001  2016_2923_2321  ACME        ABC_Project New Model   2016    2022

如果Column2 中有更多值,最好使用动态 SQL。

【讨论】:

  • 非常感谢。这就是我要的。我会用这个解决方案编辑我的小提琴,但不幸的是 sqlfiddle 网站没有响应。我稍后再试。
猜你喜欢
  • 2018-04-04
  • 2014-07-17
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多