爲了得到這個結果,您將需要使用PIVOT
函數。這將多行中的數據轉換爲列。
如果您事先知道這些值,或者您將擁有有限數量的TestId
值,則可以對查詢進行硬編碼以使查詢處於靜態狀態。
SELECT Name,
Age,
[1] AS Test1,
[2] AS Test2,
[3] AS Test3
FROM
(
SELECT P.Name, P.Age, t.TestID, t.Result
FROM tests t
INNER JOIN person P
ON p.ID = t.PersonID
) T
PIVOT
(
sum(Result)
FOR TestID IN ([1], [2], [3])
) piv;
參見SQL Fiddle with Demo。
但是,如果您的值有未知數TestId
,那麼您將希望使用動態SQL在運行時生成列的列表。您的編碼將爲:
DECLARE @cols AS NVARCHAR(MAX),
@colNames AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(testId)
from tests
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colNames = STUFF((SELECT distinct ',' + QUOTENAME(testId) +' as Test'+cast(testId as varchar(10))
from tests
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Name, age, ' + @colnames + ' from
(
select P.Name, P.Age, t.TestID, t.Result
from tests t
inner join person P
on p.ID = t.PersonID
) x
pivot
(
sum(Result)
for TestID in (' + @cols + ')
) p '
execute(@query)
請參閱SQL Fiddle with Demo。
它們都將產生相同的結果,區別在於動態的將增大/減小列,如果測試IDS更改次數:
| NAME | AGE | TEST1 | TEST2 | TEST3 |
--------------------------------------
| Jack | 25 | 125 | 120 | 75 |
| Jill | 23 | 90 | 95 | 7.2 |
我用這樣的HTTP的功能:// www.itrain.de/knowhow/sql/tsql/pivot/sp_transform_v1_1.asp 但我的尺寸會超大。 – bummi 2013-02-09 09:05:39