在 SQL 中结合使用 Pivot 函数和 Sum 函数
Using Pivot function in conjunction with Sum function in TSQL
我正在尝试从这个 table 创建一个查询:上面是我的 table,下面是我需要显示的查询。
我尝试过的:
首先,我尝试使用 UNION,但它不允许我求和或求平均值。然后我尝试使用 PIVOT 函数进行试验,但同样,问题是百分比要求。我不想做的一件事是创建一个 table 然后将信息存储在那里。我认为这可以通过查询来解决,所以这不是一个理想的解决方案。总数的百分比是通过获取产品类别的总订单来计算的。在示例中是 001,然后将子类别区域的总订单除以总订单。非常非常感谢!
query and resultset
您想要的东西更像是 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 的订单总和。为了做到这一点并且仍然可以访问其他列,我们使用带有 'PARTITION BY' 的 OVER 子句,就像这样(而不是带有 GROUP BY
的 sub-query,这将阻止我们重新连接到u.[Total Orders]
):
SUM(u.[Total Orders]) OVER (PARTITION BY p.ProductCategory)
就这么简单。然后通过将 u.[Total Orders]
除以那个,我们得到了我们想要的。这使其成为 1 的一部分(即 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
;
我正在尝试从这个 table 创建一个查询:上面是我的 table,下面是我需要显示的查询。
我尝试过的: 首先,我尝试使用 UNION,但它不允许我求和或求平均值。然后我尝试使用 PIVOT 函数进行试验,但同样,问题是百分比要求。我不想做的一件事是创建一个 table 然后将信息存储在那里。我认为这可以通过查询来解决,所以这不是一个理想的解决方案。总数的百分比是通过获取产品类别的总订单来计算的。在示例中是 001,然后将子类别区域的总订单除以总订单。非常非常感谢!
query and resultset
您想要的东西更像是 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 的订单总和。为了做到这一点并且仍然可以访问其他列,我们使用带有 'PARTITION BY' 的 OVER 子句,就像这样(而不是带有 GROUP BY
的 sub-query,这将阻止我们重新连接到u.[Total Orders]
):
SUM(u.[Total Orders]) OVER (PARTITION BY p.ProductCategory)
就这么简单。然后通过将 u.[Total Orders]
除以那个,我们得到了我们想要的。这使其成为 1 的一部分(即 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
;