2013-06-27 76 views
0

下午夥計n女孩。SQL Server 2008 CrossTab等效

使用SQL Server 2008

我有一個表稱爲userModList。其包含字段「USERID」(int),「ModuleID」(int)和「通過」(bin)。 示例數據;

USERID ModuleID Passed 
134   12   1 
134   10   0 
134   18   1 

什麼,我想顯示爲:

USERID (moduleNum12)  (ModuleNum10)  (ModuleNum18) 
134   1     0     1 

現在在MS訪問所有你要做的就是創建一個交叉查詢,所以用戶ID變成的行,模塊數成爲和通過是(二進制1或0)。

我想做一個存儲過程中的服務器端,但我從來沒有嘗試過交叉標籤數據。

另外moduleID是動態的這意味着可能有3個模塊爲用戶或17個。所以它需要是動態的,不知道這是否有很大的不同?

無論如何,一些幫助將是偉大的,生病嘗試,並提供一些示例代碼我將嘗試,但就目前而言,我堅持從哪裏開始。

非常感謝的傢伙!

回答

1

有幾種不同的方式,你可以這樣做在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

+0

這就是我一直在尋找進入,但「in」方法期望你也知道有多少個模塊。不幸的是,這部分需要動態。你會做什麼擴展? – lemunk

+0

@StevenSmith我正在添加該版本。你將不得不使用動態SQL是值是未知的。 – Taryn

+0

感謝您的快速回答bluefeet!生病檢查出來,看起來很可怕,但希望能解決這個問題。什麼是「STUFF((...」只是一個通用名稱或引用方法? – lemunk