#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 И т. Д.?