组内事务 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 计算的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中针对事务表计算一段时间内的覆盖日期?

MySQL ----- 事务

12.关于mysql事物。

几分钟后终止 SQL Server 事务

事务的四个特性和事务的隔离级别

事务的隔离级别