SQL如何透视和聚合另一列?

时间:2019-06-28 12:18:20

标签: sql-server tsql pivot

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

我有一个表,其中包含[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);

有人可以帮助我该怎么做吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

| 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?

答案 1 :(得分:0)

在下面的代码中尝试此操作-

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)