Динамическое преобразование столбцов в SQL Сервер - PullRequest
0 голосов
/ 20 марта 2020

У меня вопрос по поводу SQL Сервер: как динамически преобразовать строки в столбцы, если строки имеют более 1 на основе уникальных идентификаторов в SQL Сервер?

Вот таблица с уникальными столбцами productid и productname:

CREATE TABLE [dbo].[productdetails]
(
    [productid] [varchar](50) NULL,
    [productname] [varchar](50) NULL,
    [price] [money] NULL,
    [units] [int] NULL,
    [sdate] [date] NULL
) 

INSERT [dbo].[productdetails] ([productid], [productname], [price], [units], [sdate]) 
VALUES (N'1', N'rin', 10.0000, 1, CAST(N'2019-01-01' AS Date))

INSERT [dbo].[productdetails] ([productid], [productname], [price], [units], [sdate]) 
VALUES (N'1', N'rin', 20.0000, 1, CAST(N'2019-04-03' AS Date))

INSERT [dbo].[productdetails] ([productid], [productname], [price], [units], [sdate]) 
VALUES (N'2', N'pen', 5.0000, 1, CAST(N'2019-05-07' AS Date))

INSERT [dbo].[productdetails] ([productid], [productname], [price], [units], [sdate]) 
VALUES (N'2', N'pen', 20.0000, 1, CAST(N'2019-09-08' AS Date))

INSERT [dbo].[productdetails] ([productid], [productname], [price], [units], [sdate]) 
VALUES (N'2', N'pen', 30.0000, 1, CAST(N'2020-09-03' AS Date))

INSERT [dbo].[productdetails] ([productid], [productname], [price], [units], [sdate]) 
VALUES (N'3', N'mobil', 9000.0000, 1, CAST(N'2019-09-04' AS Date))

Исходя из приведенных выше данных, я хочу вывод, как это:

productid|productname|price |units  |sdate      |productid|productname|price|units  |sdate     |productid|productname|price|units   |sdate
1   |rin         |10.00 |1  |2019-01-01 |1        |rin        |20.00|1      |2019-04-03
3       |mobil       |9000      |1      |2019-09-04
2   |pen         |5.00  |1  |2019-05-07 |2        |pen        |20.00|1      |2019-09-08|2        |pen        |30.00|1      |2020-09-03

Я пытался это SQL выражение:

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

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(seq) 
                      FROM   
                          (SELECT 
                               'SampleTitle' +
                        CAST(ROW_NUMBER() OVER (PARTITION BY productid, productname ORDER BY sdate) AS varchar(10)) seq
                           FROM productdetails) d
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = 'SELECT columnA, ColumnB,' + @cols + ' 
             from 
             (
               select productid, productname
                ,[price]
      ,[units]
      ,[sdate]
                ''SampleTitle''+
                  cast(row_number() over(partition by productid, productname
                                          order by sdate) as varchar(10)) seq
               from productdetails
            ) x
            pivot 
            (
                max(sdate)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;

но приведенный выше код завершается ошибкой.

Не могли бы вы рассказать мне, как решить эту задачу на SQL Сервере?

...