То, что вам нужно, больше похоже на функциональность UNPIVOT, чем на функцию PIVOT, но я предпочитаю использовать для этого APPLY. Давайте начнем с этого, а затем перейдем к процентному соотношению (для которого будет использоваться предложение OVER).
SELECT t.ProductCategory, t.ProductSubCategory, u.Region, u.[Total Orders]
FROM dbo.OriginalTable t
CROSS APPLY
(SELECT 'North America' as Region, [Total Orders Placed in North America] as [Total Orders]
UNION ALL
SELECT 'South America' as Region, [Total Orders Placed in South America] as [Total Orders]
UNION ALL
SELECT 'North Africa' as Region, [Total Orders Placed in North Africa] as [Total Orders]
UNION ALL
SELECT 'South Africa' as Region, [Total Orders Placed in South Africa] as [Total Orders]
) u
;
Верно, теперь давайте отсортируем этот процент.
Мы хотим рассмотреть сумма заказов по ProductCategory. Чтобы сделать это и по-прежнему иметь доступ к другим столбцам, мы используем предложение OVER с PARTITION BY, как это (вместо подзапроса с GROUP BY
, который помешал бы нам снова подключиться к u.[Total Orders]
):
SUM(u.[Total Orders]) OVER (PARTITION BY p.ProductCategory)
Это так просто. Итак, разделив на это u.[Total Orders]
, мы получим то, что хотим. Это оставляет его как часть 1 (ie, 1,5% будет 0,015), но вы можете управлять тем, как он отображается во всем, что потребляет ваш окончательный запрос.
SELECT t.ProductCategory, t.ProductSubCategory, u.Region, u.[Total Orders],
u.[Total Orders] / SUM(u.[Total Orders]) OVER (PARTITION BY t.ProductCategory) as [Percentage of Total]
FROM dbo.OriginalTable t
CROSS APPLY
(SELECT 'North America' as Region, [Total Orders Placed in North America] as TotalOrders
UNION ALL
SELECT 'South America' as Region, [Total Orders Placed in South America] as [Total Orders]
UNION ALL
SELECT 'North Africa' as Region, [Total Orders Placed in North Africa] as [Total Orders]
UNION ALL
SELECT 'South Africa' as Region, [Total Orders Placed in South Africa] as [Total Orders]
) u
;