有幾種不同的方式,你可以這樣做在SQL Server中,你可以使用旋轉功能:
select userid,
[12] moduleNum12,
[10] moduleNum10,
[18] moduleNum18
from
(
select userid, moduleid, cast(passed as int) passed
from yourtable
) d
pivot
(
max(passed)
for moduleId in ([12], [10], [18])
) piv;
見Demo
或者你可以使用聚合函數CASE表達式:
select userid,
max(case when moduleid = 12 then cast(passed as int) end) moduleNum12,
max(case when moduleid = 10 then cast(passed as int) end) moduleNum10,
max(case when moduleid = 18 then cast(passed as int) end) moduleNum18
from yourtable
group by userid;
請參閱Demo。
上述工作巨大的,如果值是已知的螺母,如果您有未知的值,那麼你就需要使用動態SQL:
DECLARE @cols AS NVARCHAR(MAX),
@colsAlias AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ModuleID)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsAlias = STUFF((SELECT distinct ', ' + QUOTENAME(ModuleID) +' as moduleNum'+cast(ModuleID as varchar(10))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT userid,' + @colsAlias + '
from
(
select userid, moduleid, cast(passed as int) passed
from yourtable
) d
pivot
(
max(passed)
for moduleid in (' + @cols + ')
) p '
execute(@query)
見Demo
這就是我一直在尋找進入,但「in」方法期望你也知道有多少個模塊。不幸的是,這部分需要動態。你會做什麼擴展? – lemunk
@StevenSmith我正在添加該版本。你將不得不使用動態SQL是值是未知的。 – Taryn
感謝您的快速回答bluefeet!生病檢查出來,看起來很可怕,但希望能解決這個問題。什麼是「STUFF((...」只是一個通用名稱或引用方法? – lemunk