Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
SQLServer2008透视表_Sql_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

SQLServer2008透视表

SQLServer2008透视表,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有下表 GROUP Number Sum SOURCE a 1 -2503 WTH a 2 -180 DET a 3 -156 PLY a 4 -99 DET a 5 -252 DET 我想介绍如下 GROUP Number Sum DET PLY WTH a 1 -2503

我有下表

GROUP   Number  Sum     SOURCE
a           1   -2503   WTH
a           2   -180    DET
a           3   -156    PLY
a           4   -99     DET
a           5   -252    DET
我想介绍如下

GROUP   Number  Sum      DET    PLY     WTH
a           1   -2503                   -2503
a           2   -180    -180        
a           3   -156           -156 
a           4   -99     -99     
a           5   -252    -252        
以下是我使用PIVOT尝试的(未成功的)内容

SELECT
    [GROUP]
    ,Number
    ,Opening_Val
    ,[Sum]
    ,DET
    ,PLY
    ,WTH
FROM
(SELECT 
     IA.GROUP_CD
    ,IA.Number
    ,IA.[sum]
    ,Src
FROM dbo.##Inter_App IA
GROUP BY IA.[GROUP]
    ,IA.Number
    ,IA.[sum]
    ,Src ) query
PIVOT 
(   Sum(IA.[Sum])
    For Src in (DET, PLY, WTH)
) pvt
理想情况下,我不想将列限制为(DET、PLY、WTH),因为可能有更多我不知道的源

谢谢你的帮助


谢谢,詹姆斯,你的尝试太复杂了:)。 此外,请为列选择其他名称,而不是sum、group和number,因为这些名称不仅是sql语法关键字,还使查询更难阅读(例如sum([sum])、group by[group])


您现有的查询有一些问题

首先,我不知道为什么在子查询中对所有列都使用GROUPBY。这是没有必要的,除非你知道你有重复,你不希望在最终结果

其次,您试图在最终选择列表中显示
[sum]
列,但您也在数据透视中聚合此数据--
sum(IA.[sum])
--除非子查询将此列列出两次,否则无法聚合数据并显示此值

第三,PIVOT中使用的聚合引用的是
IA
表别名-此别名在子查询之外不可用,因此语法也不起作用

我将更改您的查询以使用以下内容:

select [group], [number], [sum], DET, PLY, WTH
from
(
  select [group], [number], 
    [sum], 
    [sum] pivsum, SOURCE
  from dbo.Inter_App
) d
pivot
(
  sum(pivsum)
  for SOURCE in (DET, PLY, WTH)
) piv;
看。您会注意到,子查询有两列带有
[sum]
-其中一列是我提供的别名
pivsum
-这将用于数据透视中的聚合,另一列将用于最终选择列表

最后,您声明可能有未知数量的
值,如果是这种情况,则需要使用动态SQL生成结果:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(SOURCE) 
                    from Inter_App
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [group], [number], 
                [sum], ' + @cols + ' 
            from 
            (
              select [group], [number], 
                [sum], 
                [sum] pivsum, SOURCE
              from dbo.Inter_App
            ) x
            pivot 
            (
                sum(pivsum)
                for SOURCE in (' + @cols + ')
            ) p '

execute sp_executesql @query;
看。两个版本都给出了一个结果:

| GROUP | NUMBER |   SUM |    DET |    PLY |    WTH |
|-------|--------|-------|--------|--------|--------|
|     a |      1 | -2503 | (null) | (null) |  -2503 |
|     a |      2 |  -180 |   -180 | (null) | (null) |
|     a |      3 |  -156 | (null) |   -156 | (null) |
|     a |      4 |   -99 |    -99 | (null) | (null) |
|     a |      5 |  -252 |   -252 | (null) | (null) |

谢谢你非常清楚的回答。不幸的是,我没有足够的代表+1你。詹姆斯,有时我有两行的数字相同,但一行的SOURCE=DET,另一行的SOURCE=PLY。我的建议是,如果你有一个新问题,那么就创建一个新问题,其中包含解决问题的所有要求。
| GROUP | NUMBER |   SUM |    DET |    PLY |    WTH |
|-------|--------|-------|--------|--------|--------|
|     a |      1 | -2503 | (null) | (null) |  -2503 |
|     a |      2 |  -180 |   -180 | (null) | (null) |
|     a |      3 |  -156 | (null) |   -156 | (null) |
|     a |      4 |   -99 |    -99 | (null) | (null) |
|     a |      5 |  -252 |   -252 | (null) | (null) |