sql-server - 在 TSQL 中将 Pivot 函数与 Sum 函数结合使用
问题描述
我正在尝试从该表创建一个查询:上面是我的表,下面是我需要我的查询显示的内容。
我尝试过的: 首先,我尝试使用 UNION,但它不允许我求和或求平均值。然后我尝试使用 PIVOT 功能,但同样,问题是百分比要求。我不想做的一件事是创建一个表,然后将信息存储在那里。我认为这可以通过查询来解决,所以这不是一个理想的解决方案。通过获取产品类别的总订单数计算占总数的百分比。在示例中为 001,然后将子类别区域的总顺序除以总数。非常非常感谢提前!
解决方案
您想要的那种东西更像是 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
,这会阻止我们重新挂钩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
;
推荐阅读
- mongodb - MongoExpress 显示“无法读取未定义的属性 'listDatabases'”错误
- c++ - C ++如何将Parent传递给需要Child的函数?
- c# - 使用带有 C# 的 AWS S3 程序集的问题
- c++ - 你如何反转strong_ordering?
- php - 将小数添加到脚本中的 PHP 输出
- swift - 首次调用信号时如何使用 Dispatch_Sempahore
- javascript - Telegraf 和云功能:如何阻止 Telegram Bot 接收无休止的旧更新
- javascript - 如何以角度在 ag grid masterdetail 的 detailCellRendererParams 内进行控制台
- shell - 如何使用 shell 脚本过滤字符串
- karate - 空手道加特林:未获取对功能文件的更改