组内事务 SQL 计算
Posted
技术标签:
【中文标题】组内事务 SQL 计算【英文标题】:Transact SQL Calculation within group 【发布时间】:2017-07-16 08:46:02 【问题描述】:我想计算组内的权重。假设我有一个这样的表,其中包含一个组变量,并且我想计算重量列,该列是该组内所有产品值总和的产品值。如何做到这一点?
数据示例:
我想离开这张桌子:
到这张桌子:
这意味着重量列不存在。目标是创建一个新表,其中包含所有原始列以及一个名为 weight 的新列。
重量计算示例:对于第 5 行 B 组产品 x,重量计算为重量 = 10/40。
【问题讨论】:
【参考方案1】:您可以使用窗口函数来实现这一点。这是一个例子:
SELECT
1.0 / (SUM([Value]) OVER (PARTITION BY [Group])) * [Value] AS [Weight]
FROM [YourTable]
我建议您在现有表格的顶部创建一个视图(当然取决于您的需要)。您可以像这样创建视图:
CREATE VIEW [YourView] AS
SELECT
[Group],
Product,
[Value],
CASE
WHEN (SUM([Value]) OVER (PARTITION BY [Group])) = 0 THEN 0
ELSE 1.0 / (SUM([Value]) OVER (PARTITION BY [Group])) * [Value] END AS [Weight]
FROM [YourTable]
【讨论】:
如果某些组的总和(值)等于零怎么办?我们该如何防范呢?例如在计算中过滤掉它们? 您可以使用 CASE WHEN 语句在执行除法之前检查组和是否为 0。我已经更新了我的回答中的 CREATE VIEW 语句,以提供一个示例。我选择在 Group 的 SUM 为 0 时返回 0 作为 [Weight],但您可以根据需要更改此设置。【参考方案2】:SELECT [group], SUM(weight)
FROM table
GROUP BY [group]
响应您的评论 - 您可以创建一个视图,当您查询它时会即时计算重量:
CREATE VIEW [dbo].[GroupWeights]
AS
SELECT [group], SUM(weight)
FROM table
GROUP BY [group]
回答您问题中最近的编辑:
CREATE VIEW ProductWeights
AS
SELECT [p.group], product, value, (value / (SELECT SUM(value) FROM Products WHERE [group] = [p.group] GROUP BY [group])) AS [weight]
FROM Products AS p
【讨论】:
重量列不存在。目标是创建权重列,即一个包含先前列和权重列的新表 请看我的编辑这个答案不计算权重 如果某些组的总和(值)等于零怎么办?我们该如何防范呢?例如在计算中过滤掉它们?【参考方案3】:您可以使用 SELECT INTO 来创建新表,并使用带分区的 SUM 来按组获取总和,如下所示:
Select [Group], Product, [Value],
[Weight] = ([Value]*1.0)/SUM([Value]) over(Partition by [Group])
INTO NewTable from YourTable
【讨论】:
以上是关于组内事务 SQL 计算的主要内容,如果未能解决你的问题,请参考以下文章