Использование функции Pivot вместе с функцией Sum в TSQL - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь создать запрос из этой таблицы: вверху - моя таблица, а внизу - то, что мне нужно для отображения запроса.

Что я пробовал: сначала, Я пробовал использовать UNION, но это не позволило мне суммировать или усреднять. Затем я попытался поэкспериментировать с функцией PIVOT, но опять же проблема в процентном требовании. Одна вещь, которую я не хотел делать, - это создавать таблицу, а затем хранить в ней информацию. Я думаю, что это можно решить с помощью запроса, так что это нежелательное решение. % от общей суммы рассчитывается путем получения общего количества заказов для категории продукта. В данном примере это 001, а затем общий порядок для подкатегории разделен на общий. Большое, большое спасибо!

запрос и набор результатов

1 Ответ

1 голос
/ 07 августа 2020

То, что вам нужно, больше похоже на функциональность 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
;
...