0

下午的男人和女孩。

使用 SQL SERVER 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 是动态的,这意味着一个用户可能有 3 个模块或 17 个模块。所以它需要是动态的,不确定这是否有很大的不同?

无论如何,这方面的一些帮助会很棒,我会尝试并提供一些我将尝试的示例代码,但就目前而言,我不知道从哪里开始。

非常感谢你们!

4

1 回答 1

1

在 SQL Server 中有几种不同的方法可以执行此操作,您可以使用 PIVOT 函数:

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 回答