Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_Pivot - Fatal编程技术网

Sql 透视表问题:原始表或枚举中没有标识符

Sql 透视表问题:原始表或枚举中没有标识符,sql,sql-server,pivot,Sql,Sql Server,Pivot,我在使用透视表或动态表时遇到问题 我发现这个例子非常有助于理解我如何完成这项任务;但是,我缺少Insidentifier列 上面的帖子中提供了一个SQL FIDLE: 您可以看到,在第二个表propertyObjects中,每个objectID都有一个计数1、2、3、4。我没有那个财产ID计数。这是我所有的 case category 1 xx 1 xyx 1 abc 2 ghj 2 asdf 3 dfgh 正如您所看到的,每个案

我在使用透视表或动态表时遇到问题

我发现这个例子非常有助于理解我如何完成这项任务;但是,我缺少Insidentifier列

上面的帖子中提供了一个SQL FIDLE:

您可以看到,在第二个表propertyObjects中,每个objectID都有一个计数1、2、3、4。我没有那个财产ID计数。这是我所有的

case  category
1      xx
1      xyx
1      abc
2      ghj
2      asdf
3      dfgh
正如您所看到的,每个案例都有许多不同的类别,但没有类别标识符字段

这就是我需要的:

case  cat1  cat2  cat3
1     xx    xyx   abc
2     ghj   asdf
3     dfgh
因此,我想我可能需要在源表中添加一列,并以某种方式枚举每个案例的类别。这将使我能够在提供的示例中使用pivot。想法


我尝试使用
行编号来完成此操作,但它不会停止在每个案例编号处,而是继续计算整个表。

由于每个
案例都有多个值,因此需要使用
行编号()
来获得每个类别的单独列

在编写动态SQL版本之前,我首先要编写一个硬编码版本。代码类似于:

SELECT [case], cat1, cat2, cat3
FROM
(
    SELECT [case], category,
      'cat'+
        cast(row_number() over(partition by [case] 
                               order by category) as varchar(10)) seq
    FROM yourTable
) x
PIVOT
(
   max(category)
   for seq in (cat1, cat2, cat3)
)p;

现在,您已将逻辑关闭,然后可以将其转换为动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('cat'+cast(seq as varchar(10))) 
                    from
                    (
                      select row_number() over(partition by [case] 
                                               order by category) seq
                      from yourtable
                    ) d
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [case],' + @cols + ' 
            from 
            (
              SELECT [case], category,
                ''cat''+
                  cast(row_number() over(partition by [case] 
                                         order by category) as varchar(10)) seq
              FROM yourTable
            ) x
            pivot 
            (
                max(category)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;
看。这将为您提供以下结果:

| CASE | CAT1 |   CAT2 |   CAT3 |
|------|------|--------|--------|
|    1 |  abc |     xx |    xyx |
|    2 | asdf |    ghj | (null) |
|    3 | dfgh | (null) | (null) |

由于每个
案例都有多个值
,因此需要使用
行编号()
来获取每个类别的单独列

在编写动态SQL版本之前,我首先要编写一个硬编码版本。代码类似于:

SELECT [case], cat1, cat2, cat3
FROM
(
    SELECT [case], category,
      'cat'+
        cast(row_number() over(partition by [case] 
                               order by category) as varchar(10)) seq
    FROM yourTable
) x
PIVOT
(
   max(category)
   for seq in (cat1, cat2, cat3)
)p;

现在,您已将逻辑关闭,然后可以将其转换为动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('cat'+cast(seq as varchar(10))) 
                    from
                    (
                      select row_number() over(partition by [case] 
                                               order by category) seq
                      from yourtable
                    ) d
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [case],' + @cols + ' 
            from 
            (
              SELECT [case], category,
                ''cat''+
                  cast(row_number() over(partition by [case] 
                                         order by category) as varchar(10)) seq
              FROM yourTable
            ) x
            pivot 
            (
                max(category)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;
看。这将为您提供以下结果:

| CASE | CAT1 |   CAT2 |   CAT3 |
|------|------|--------|--------|
|    1 |  abc |     xx |    xyx |
|    2 | asdf |    ghj | (null) |
|    3 | dfgh | (null) | (null) |

抱歉格式化失败抱歉格式化失败如果我想添加一列或更多列怎么办?我编辑了该模式,添加了n个额外的status字段,因此最终结果如下:case | cat1 | status1 | cat2 | status2等等。我不知道如何将其添加到查询中的QUOTENAME和以下内容。@JoshuaRivers我的建议是发布一个带有新要求的新问题。如果我想添加一列或更多列,该怎么办?我编辑了该模式,添加了n个额外的status字段,因此最终结果如下:case | cat1 | status1 | cat2 | status2等等。我不知道如何将其添加到查询中的QUOTENAME和下面的内容中。@JoshuaRivers我的建议是发布一个新的问题和新的要求。