【问题标题】:SQL How to pivot and aggregate another column?SQL 如何旋转和聚合另一列?
【发布时间】:2019-06-28 12:18:20
【问题描述】:

我正在尝试对表格进行透视,但也将每条记录分组为一个。这是我的问题:

我有一张表,其中包含 [SchemeCode]、[MonthYear] 和 [Revenue]。每个 [SchemeCode] 有多个 [MonthYear] 及其对应的 [Revenue]。

| Scheme Code | MonthYear | Revenue |
|-------------|-----------|---------|
| 18VDA       | 2018.1    | 100     |
| 18VDA       | 2018.2    | 200     |
| 18VDA       | 2018.3    | 200     |

但我正在努力让它变成这样:

| Scheme Code | 2018.1 | 2018.2 | 2018.3 |
|-------------|--------|--------|--------|
| 18VDA       | 100    | 200    | 300    |

我知道正常旋转是如何工作的,但问题是当我这样做时,输出会保留三个 18VDA 记录,如下所示:

| Scheme Code | 2018.1 | 2018.2 | 2018.3 |
|-------------|--------|--------|--------|
| 18VDA       | 100    | --     | --     |
| 18VDA       | --     | 200    | --     |
| 18VDA       | --     | --     | 300    |

我希望方案代码也全部聚合为一个。下面是我用来创建上表的代码:

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


select @cols = STUFF((SELECT ',' + QUOTENAME([MonthYear]) 
                    from TableA
                    group by [MonthYear]--, id
                    --order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = '[Scheme Code],' + @cols + '

from TableA
pivot(sum([Revenue]) for MonthYear in (' + @cols + ') 

          ) as RevenueMonth'

          execute(@query);

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    试试下面的代码-

    DECLARE @cols AS NVARCHAR(MAX),
    @sqlCommand  AS NVARCHAR(MAX)
    
    SELECT  @cols =
    STUFF((SELECT   ( '],[' +  A.MonthYear)
            FROM (SELECT DISTINCT MonthYear FROM TableA) A
            ORDER BY A.MonthYear 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')+']'
    FROM TableA
    
    --SELECT @cols
    
    SET @sqlCommand= 
    N'SELECT [Scheme Code],'+SUBSTRING(@cols,2,LEN(@cols))+'
    FROM 
    (
        SELECT [Scheme Code],[MonthYear],[Revenue] FROM your_table
    ) AS P
    PIVOT
    (
        SUM(Revenue)
        FOR MonthYear IN('+SUBSTRING(@cols,2,LEN(@cols))+')
    ) PVT'
    
    --PRINT @sqlCommand
    EXEC (@sqlCommand)
    

    【讨论】:

      【解决方案2】:

      我尝试了您的代码,并为我工作。不得不使用临时表,但这没有任何区别。起初确实产生了一个错误,但通过将 select 关键字添加到 @query 它确实提供了所需的结果。

      | Scheme Code   | 2018.1 | 2018.2   | 2018.3    |
      |---------------|--------|----------|-----------| 
      | 18VDA         | 100    | 200      | 200       |
      

      测试查询:

      if object_id('tempdb.dbo.#TableA') is not null drop table #TableA
      create table #TableA ([Scheme Code] varchar(20), [MonthYear] varchar(20), [Revenue] int)
      
      insert into #TableA( [Scheme Code], MonthYear, Revenue )
      values
          ('18VDA','2018.1',100)
          , ('18VDA','2018.2',200)
          , ('18VDA', '2018.3',200)
      
      
      declare @cols AS NVARCHAR(MAX),
      @query  AS NVARCHAR(MAX)
      
      
      select @cols = STUFF((SELECT ',' + QUOTENAME([MonthYear]) 
                          from #TableA
                          group by [MonthYear]--, id
                          --order by id
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'')
      
      set @query = 'select [Scheme Code],' + @cols + '
      
      from #TableA
      pivot(sum([Revenue]) for MonthYear in (' + @cols + ') 
      
                ) as RevenueMonth'
      
      
      print @query
                execute(@query)
      

      您使用的是什么 MSSQL?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        相关资源
        最近更新 更多