我有一张这样的表:
+-------------+-----------+------------+
| 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循环提出了一个复杂的解决方案 但它很慢并且想知道,有没有办法只用一个选择呢?
感谢
答案 0 :(得分:1)
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')