Я пытаюсь повернуть таблицу, но также группировать каждую запись в одну. Это моя проблема:
У меня есть таблица с [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);
Может ли кто-нибудь помочь мне в том, как я могу это сделать?
Спасибо!





Я попробовал ваш код, и он работал на меня. Пришлось использовать временную таблицу, но это не имеет никакого значения. Сначала выдавало ошибку, но добавление ключевого слова Выбрать к @запрос дало желаемый результат.
| 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 вы используете?
Попробуйте этот код ниже-
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)