下午好女孩们。
使用SQL SERVER 2008。
我有一张叫userModList的桌子。Its包含字段、"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 access中,您所要做的就是创建一个交叉查询,因此用户ID成为行,模块编号成为列,传递的是值(二进制值1或0)。
我想在存储过程中做这个服务器端,但是我从来没有尝试过跨选项卡数据。
另外,moduleID是动态的,这意味着一个用户或17个用户可能有3个模块。所以它需要是动态的,不确定这是否有很大的不同?
无论如何,在这方面提供一些帮助是很棒的,我会尝试提供一些我将要尝试的示例代码,但是就目前情况而言,我仍然无法确定从哪里开始。
非常感谢各位!
发布于 2013-06-27 14:12:13
在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)请参阅演示
https://stackoverflow.com/questions/17345493
复制相似问题