SQL Server сводит все столбцы таблицы

#sql #sql-server #pivot #pivot-table

#sql #sql-сервер #сводная #сводная таблица

Вопрос:

Я бы хотел свернуть свою таблицу по всем ее столбцам, например, по исходной таблице

Дата отчета Всего заказов Итоговые порядки значений Элемент OrderItem1 Элемент заказа 2
2021-01-11 5 25 3 2
2021-01-12 7 50 5 2
2021-01-13 10 65 5 5

К следующему:

Заголовок 2021-01-11 2021-01-12 2021-01-13
Всего заказов 5 7 10
Итоговые порядки значений 25 50 65
Элемент OrderItem1 3 5 5
Элемент заказа 2 2 2 5

Это то, что я делал до сих пор, но я не уверен, что это самый эффективный способ сделать это, честно говоря, любые другие предложения приветствовались бы — (1) также, как бы мне получить строки в соответствующем порядке сортировки, который мне нужен, и (2) также, что делатьесли новая строка данных вставлена с новой датой для динамических имен столбцов даты

 create table #Results(
ReportDate dateTime
,TotalOrders nvarchar(10)
,TotalValueOrders Nvarchar(10)
,OrderItem1 nvarchar(10)
,OrderItem2 nvarchar(10)
)

insert #Results
values('2021-01-11','5','25','3','2')
,('2021-01-12','7','50','5','2')
,('2021-01-13','10','65','5','5')

--select * from #Results

SELECT * FROM 
(
SELECT 'TotalValueOrders' as Header, ReportDate ,TotalValueOrders
 FROM #Results SOH 
    
) AS Sales 
PIVOT (max(TotalValueOrders)
FOR ReportDate IN ([2021-01-11 00:00:00.000],[2021-01-12 00:00:00.000],[2021-01-13 00:00:00.000]))
as PVT
union
SELECT * FROM 
(
SELECT 'OrderItem1' as Header,ReportDate ,OrderItem1
 FROM #Results SOH 
    
) AS Sales 
PIVOT (max(OrderItem1)
FOR ReportDate IN ([2021-01-11 00:00:00.000],[2021-01-12 00:00:00.000],[2021-01-13 00:00:00.000]))
as PVT
union
SELECT * FROM 
(
SELECT 'OrderItem2' as Header, ReportDate ,OrderItem2
 FROM #Results SOH 
    
) AS Sales 
PIVOT (max(OrderItem2)
FOR ReportDate IN ([2021-01-11 00:00:00.000],[2021-01-12 00:00:00.000],[2021-01-13 00:00:00.000]))
as PVT
union
SELECT  * FROM 
(
SELECT 'TotalOrders' as Header ,ReportDate ,TotalOrders --,TotalValueOrders,OrderItem1,OrderItem2
 FROM #Results SOH 
    
) AS Sales 
PIVOT (max(TotalOrders)
FOR ReportDate IN ([2021-01-11 00:00:00.000],[2021-01-12 00:00:00.000],[2021-01-13 00:00:00.000])) 
as PVT
 

Комментарии:

1. Это не самый эффективный вариант. Что вам действительно нужно сделать, так это открепить ваши данные, а затем повернуть их. Я бы лично также предложил использовать VALUES конструкцию таблицы для unpivot и условную агрегацию для pivot, а не более ограничительные UNPIVOT PIVOT операторы and . Конечно, все эти решения будут статическими; они не изменят столбцы, возвращаемые при получении дополнительных значений для ReportDate . Если вам нужно динамическое решение, я предлагаю переосмыслить ваши решения, чтобы сделать это в SQL. Матрица в SSRS или сводная таблица в Excel были бы гораздо лучшими вариантами для этого.

2. Если вы хотите, чтобы он был динамическим и добавлял новые даты, вам нужно будет создать динамический SQL для создания запроса для вас. Есть ли причина, по которой вы хотите сделать это в SQL, а не в потребляющем приложении, таком как SSRS, Excel И т. Д.?