我有一个由pageno int,groupid varchar(10)组成的表。表中的每一行都是不同的。可以有多个groupid和pageno组合。 pagenos的数量是未知的,并且groupid的数量是未知的。数据可能如下所示:
pageno groupid
101105 mpadilla
101105 gentry
100100 mpadilla
100100 gentry
我希望返回一个结果集,将pagenos显示为列,将groupids显示为行,将x显示为它们相交(意味着它存在于该pageno / groupid组合中)。
我会使用sql pivot吗?如果是这样,请举个例子。如果没有,请提供您的示例和说明。我有点困惑。
答案 0 :(得分:2)
您的要求并不完全清楚,但如果我理解您的问题,您可以使用PIVOT功能获取结果。
如果您的pagenos
数量有限,则此查询查询的基本语法如下:
select groupid, [101105], [100100]
from
(
select pageno, groupid,
flag = 'X'
from yourtable
) d
pivot
(
max(flag)
for pageno in ([101105], [100100])
) piv;
然后,如果您有未知数量的值,则需要使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(pageno)
from yourtable
group by pageno
order by pageno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT groupid, ' + @cols + '
from
(
select pageno, groupid,
flag = ''X''
from yourtable
) x
pivot
(
max(flag)
for pageno in (' + @cols + ')
) p '
execute sp_executesql @query;
见SQL Fiddle with Demo。两个版本都会给出结果:
| GROUPID | 100100 | 101105 |
| gentry | X | X |
| mpadilla | X | X |
| test | X | (null) |
编辑,如果你有要替换的空值,那么我将创建第二个列名列表,这个列将用于最终选择列表,它将包含coalesce
来替换空值。代码将是:
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(pageno)
from yourtable
group by pageno
order by pageno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT ', coalesce(' + QUOTENAME(pageno) +', '''') as '+QUOTENAME(pageno)
from yourtable
group by pageno
order by pageno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT groupid, ' + @colsNull + '
from
(
select pageno, groupid,
flag = ''X''
from yourtable
) x
pivot
(
max(flag)
for pageno in (' + @cols + ')
) p '
execute sp_executesql @query;
见SQL Fiddle with Demo。结果将是:
| GROUPID | 100100 | 101105 |
| gentry | X | X |
| mpadilla | X | X |
| test | X | |
答案 1 :(得分:-1)
我回答了自己的问题。我所做的是在原始表中添加一个名为customize的列。此列仅包含每个自定义页面的x。我知道多种冗余,但似乎枢轴表需要3列。所以这是我提出并运行的动态代码:
DECLARE @query VARCHAR(4000), @groupids VARCHAR(8000)
SELECT @groupids = STUFF(( SELECT DISTINCT
'],[' + LTRIM(groupid)
FROM DistinctPages
ORDER BY '],[' + LTRIM(groupid)
FOR XML PATH('')
), 1,2, '') + ']'
SET @query =
'SELECT * FROM (SELECT pageno, groupid, customized FROM DistinctPages)t
PIVOT (MAX(customized) FOR groupid
IN ('+@groupids+')) AS CustomizedPagesPerGroups'
EXECUTE (@query)