如果我理解正確的問題,你想一個10×20的結果集是這樣的:
CarID | Test1 | Test2 | .... | Test20
-------------------------------------------------------
1 | NULL | Fail | .... | true
2 | 2 | Pass | .... | false
爲此,我將利用SQL-Server 2008的PIVOT
函數。
WITH Results AS
( SELECT cars.CarID,
TestName,
TestValue
FROM Cars
CROSS JOIN SafetyTests s
LEFT JOIN TestResults res
ON res.CarID = Cars.CarID
AND res.TestID = s.TestID
)
SELECT *
FROM Results
PIVOT
( MAX(TestValue)
FOR TestName IN ([TesT1], [Test2], [Test3], [Test4])
-- LIST ALL 20 TEST NAMES HERE
) pvt
這樣做的缺點是,你必須明確地列出所有的測試名稱擺動,否則他們將不會顯示爲列,但它是可以動態地做到這一點。下面的查詢基本上與上面的查詢完全相同,但是我已經動態生成了所有列名的列表並將它們插入到查詢中。
DECLARE @SQL NVARCHAR(MAX) = ''
SELECT @SQL = @SQL + ',' + QUOTENAME(TestName)
FROM SafetyTests
SET @SQL = 'WITH Results AS
( SELECT Cars.CarID,
TestName,
TestValue
FROM Cars
CROSS JOIN SafetyTests s
LEFT JOIN TestResults res
ON res.CarID = Cars.CarID
AND res.TestID = s.TestID
)
SELECT *
FROM Results
PIVOT
( MAX(TestValue)
FOR TestName IN (' + STUFF(@SQL, 1, 1, '') + ')
) pvt'
EXECUTE SP_EXECUTESQL @SQL
SQL Fiddle
砸,絕對的感謝!我不知道有交叉連接這樣的事情。當我在上週看到加入時,我從未在W3Schools頁面上看到過這一點!它有另一個名字,如全聯接等? – mezamorphic
沒有完整連接是不同的連接 - 交叉連接只是行的笛卡爾乘積,不需要任何連接條件(我更新了左連接,因爲它缺少汽車連接來測試結果)。CROSS JOIN總是給出(左邊的行數)*(右邊的行數) – Charleh
在我的db上模擬表格並添加了一個圖像來證明它有效:) – Charleh