У меня вопрос по поводу 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 Сервере?