我正在尝试透视表,但也将每个记录分组为一个。这是我的问题:
我有一个表,其中包含[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);
有人可以帮助我该怎么做吗?
谢谢!
答案 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)