0

午後のガイズンガールズ。

SQL サーバー 2008 を使用しています。

userModListというテーブルがあります。これには、フィールド「USERID」(int)、「ModuleID」(int)、および「Passed」(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 は動的であるため、1 人のユーザーに対して 3 つまたは 17 のモジュールが存在する可能性があります。動的である必要がありますが、これが大きな違いを生むかどうかはわかりません。

とにかく、これに関するいくつかの助けは素晴らしいでしょう、私が試すもののいくつかのサンプルコードを試して提供してください。

どうもありがとう!

4

1 に答える 1

1

PIVOT 関数を使用して 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;

デモを見る

または、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;

デモを参照してください。

上記は、未知の値がある場合に値がわかっている場合にうまく機能し、動的 ​​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)

デモを見る

于 2013-06-27T14:12:13.177 に答える