2015-09-29 4 views
1

У меня есть таблица вроде этого:Транспонирование значения столбцов в заголовки столбцов

+-------------+-----------+------------+ 
| 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, цикл , но медленный и хотел бы знать, есть ли способ сделать это только с помощью select?

благодарит

+0

Вы должны опубликовать свое решение (или минимально работающий пример из этого), чтобы получить конкретные ответы. Вы вряд ли получите ответ на открытый вопрос, как это написано в настоящее время. – Brick

ответ

0

если есть слишком много значения test_name, то вы можете использовать стержень в динамического SQL:

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 ('[email protected]+'))p') 

SQLFIDDLE DEMO

+0

мой список столбцов действительно динамичен благодаря –

+0

@ Jean-FrancoisLavigne, вы можете принять этот ответ, если помогли или решили вашу проблему. – jfun

0

Вы ищете PIVOT с, которые делают эту точную вещь. Они наиболее полезны, если есть конечное число значений test_name, но они могут использоваться, даже если эти значения неизвестны заранее.

1

SQL Fiddle

сервера Настройка MS SQL 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 | 
+0

это то, что мне нужно спасибо –

Смежные вопросы