Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 动态数据透视表还是什么?_Sql_Sql Server 2008_Pivot - Fatal编程技术网

Sql 动态数据透视表还是什么?

Sql 动态数据透视表还是什么?,sql,sql-server-2008,pivot,Sql,Sql Server 2008,Pivot,我有一个由pageno int、groupid varchar(10)组成的表。表中的每一行都是不同的。可以有多个groupid和pageno组合。pagenos的数量未知,GroupId的数量未知。数据可能如下所示: pageno groupid 101105 mpadilla 101105 gentry 100100 mpadilla 100100 gentry 我希望返回一个结果集,将pageno显示为列,将groupid显示为行,并在它们相交的位置显示一个x(这意味着pageno/gr

我有一个由pageno int、groupid varchar(10)组成的表。表中的每一行都是不同的。可以有多个groupid和pageno组合。pagenos的数量未知,GroupId的数量未知。数据可能如下所示:

pageno groupid
101105 mpadilla
101105 gentry
100100 mpadilla
100100 gentry
我希望返回一个结果集,将pageno显示为列,将groupid显示为行,并在它们相交的位置显示一个x(这意味着pageno/groupid组合中存在该结果集)


我会为此使用SQLPivot吗?如果是,请给我举个例子。如果没有,请提供您的示例和解释。我有点困惑。

您的要求并不完全清楚,但如果我理解您的问题,您可以使用该函数获得结果

如果您有数量有限的
pageno
,则此查询的基本语法如下:

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;
看。两个版本都将给出一个结果:

|  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;
看。结果将是:

|  GROUPID | 100100 | 101105 |
|   gentry |      X |      X |
| mpadilla |      X |      X |
|     test |      X |        |

我回答了我自己的问题。我所做的是在我的原始表中添加一个名为customized的附加列。此列仅包含每个自定义页面的x。我知道有点多余,但pivot表似乎需要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)

谢谢蓝脚。这和我的结局非常相似。你能查看我的代码并尽可能扩展它吗?我现在想知道如何将空值更改为空或其他文本,以使结果更易于阅读。现在我有很多空值,结果很混乱。@user2766661查看我的编辑,您将创建第二列列表,用于替换空值hank you bluefeet,但我对如何将您的代码转换为我的代码有点困惑。你能看看我的代码并给我一个关于如何使用coalesce的例子吗。除了你的例子之外,我还看了很多例子,但我仍然无法让它与我的代码一起工作。请参阅下面我回答初始问题的代码。再次感谢!我又试了一次,在你的帮助下拿到了。再次感谢!