首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2008 CrossTab等效

Server 2008 CrossTab等效
EN

Stack Overflow用户
提问于 2013-06-27 14:10:19
回答 1查看 106关注 0票数 0

下午好女孩们。

使用SQL SERVER 2008。

我有一张叫userModList的桌子。Its包含字段、"USERID"(int),"ModuleID"(int),和"Passed"(bin).示例数据;

代码语言:javascript
复制
USERID    ModuleID    Passed
134         12          1
134         10          0
134         18          1

我想展示的是:

代码语言:javascript
复制
USERID    (moduleNum12)     (ModuleNum10)     (ModuleNum18)
 134           1                  0                 1

现在,在MS access中,您所要做的就是创建一个交叉查询,因此用户ID成为,模块编号成为,传递的是(二进制值1或0)。

我想在存储过程中做这个服务器端,但是我从来没有尝试过跨选项卡数据。

另外,moduleID是动态的,这意味着一个用户或17个用户可能有3个模块。所以它需要是动态的,不确定这是否有很大的不同?

无论如何,在这方面提供一些帮助是很棒的,我会尝试提供一些我将要尝试的示例代码,但是就目前情况而言,我仍然无法确定从哪里开始。

非常感谢各位!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-27 14:12:13

在Server中,您可以使用以下几种不同的方法来实现这一点:

代码语言:javascript
复制
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表达式一起使用:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

请参阅演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17345493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档