将列值转换为列标题

时间:2015-09-29 21:23:47

标签: sql sql-server

我有一张这样的表:

+-------------+-----------+------------+
| sample_name | test_name | test_value |
+-------------+-----------+------------+
| s1          | t1        | 1.5        |
| s2          | t2        | 3          |
| s3          | t1        | 8          |
| s4          | t3        | 5          |
+-------------+-----------+------------+

我想把test_names列为像这样的列标题

+-------------+------+------+------+
| sample_name |  t1  |  t2  |  t3  |
+-------------+------+------+------+
| s1          | 1.5  | null | null |
| s2          | null | 3    | null |
| s3          | 8    | null | null |
| s4          | null | null | 5    |
+-------------+------+------+------+

我使用临时表,动态sql和while循环提出了一个复杂的解决方案 但它很慢并且想知道,有没有办法只用一个选择呢?

感谢

3 个答案:

答案 0 :(得分:1)

SQL Fiddle

MS SQL Server 2008架构设置

查询1

DECLARE @Table TABLE(sample_name VARCHAR(10), test_name VARCHAR(10), test_value DECIMAL(10,2))
INSERT INTO @Table VALUES 
 ('s1','t1',1.5),        
 ('s2','t2',3  ),        
 ('s3','t1',8   ),      
 ('s4','t3',5  )


SELECT *
FROM @Table t
 PIVOT (SUM(test_value)
        FOR Test_name 
        IN (t1,t2,t3))p

<强> Results

| sample_name |     t1 |     t2 |     t3 |
|-------------|--------|--------|--------|
|          s1 |    1.5 | (null) | (null) |
|          s2 | (null) |      3 | (null) |
|          s3 |      8 | (null) | (null) |
|          s4 | (null) | (null) |      5 |

答案 1 :(得分:0)

你正在寻找那些做那件事的PIVOT。如果test_name值的数量有限,它们最有用,但即使这些值未提前知道,也可以使用它们。

答案 2 :(得分:0)

如果test_name的值太多,那么您可以在 动态sql 中使用 pivot

declare @Names varchar(max) 
select @Names = coalesce(@Names + ', ', '') + test_name 
from (select distinct test_name from tbl) t

exec('
SELECT *
FROM tbl t
 PIVOT (SUM(test_value)
        FOR Test_name 
        IN ('+@Names+'))p')

SQLFIDDLE DEMO