SQL Как развернуть и объединить другой столбец? - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь повернуть таблицу, но также сгруппировать каждую запись в одну.Это моя проблема:

У меня есть таблица, в которой есть [SchemeCode], [MonthYear] и [Доход].Каждый [SchemeCode] имеет несколько [MonthYear] и соответствующий ему [Доход].

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

IЯ знаю, как работает нормальный поворот, но проблема в том, что когда я это делаю, выходные данные сохраняют три записи 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 голосов
/ 28 июня 2019

Попробуйте это ниже код-

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)
0 голосов
/ 28 июня 2019

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

...