Как PIVOT без жесткого кодирования имен столбцов в SQL Server / Azure? - PullRequest
1 голос
/ 29 апреля 2020

С учетом следующего упрощенного сценария.

DROP TABLE IF EXISTS SourceData;
CREATE TABLE SourceData
(
    [Timestamp] DATE NOT NULL,
    [Point] NVARCHAR(100) NOT NULL,
    [Value] FLOAT NOT NULL
)

INSERT INTO SourceData
VALUES
('2020-01-01', 'A', 0.25),
('2020-01-01', 'B', 0.5),
('2020-01-01', 'C', 0.99),
('2020-01-02', 'A', 0.30),
('2020-01-02', 'B', 0.75),
('2020-01-02', 'C', 1.50),
('2020-01-03', 'A', 0.35),
('2020-01-03', 'B', 0.80),
('2020-01-03', 'C', 1.75)


SELECT 
    *
FROM
(
    SELECT
        [Timestamp],
        [Point],
        [Value]
    FROM SourceData
) AS SourceTable
PIVOT
(
    AVG([Value])
    FOR [Point] IN (A, B, C)
) AS PivotTable;

Возвращает:

Timestamp   A       B       C
2020-01-01  0.25    0.5    0.99
2020-01-02  0.3     0.75   1.5
2020-01-03  0.35    0.8    1.75

Fiddle Link

Возможно ли получить те же результаты без жесткого кодирования имен столбцов внутри PIVOT пункт? Я не знаю заранее, какие уникальные значения в столбце Point.

Или ... есть ли способ указать их на основе запроса?

1 Ответ

1 голос
/ 29 апреля 2020

Попробуйте это с помощью динамического c сводного запроса.

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Point) 
            FROM SourceData c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT Timestamp, ' + @cols + ' from 
            (
                select Timestamp
                    , Value
                    , Point
                from SourceData
           ) x
            pivot 
            (
                 max(Value)
                for Point in (' + @cols + ')
            ) p '

execute(@query)

Live db <> fiddle link.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...