【问题标题】:calculate cumulative comumn in mysql计算mysql中的累积列
【发布时间】:2018-03-26 08:15:22
【问题描述】:

我正在尝试创建累积列但无法创建,请查看我尝试计算的内容。

我的表

create table mytable (
    TotalQuantity Decimal(7)
); 
insert into mytable (TotalQuantity) values
(0.0),
(0.0),
(1.0),
(0.0),
(2.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(0.0),
(1.0),
(1.0),
(0.0),
(1.0);

基于上述数据集,我想计算不同的明智计数和累积总和

SELECT TotalQuantity AS DistinctTotalQuantity,
       COUNT(TotalQuantity) AS COUNTVALUE, 
       @running_total := @running_total + COUNT(TotalQuantity) AS cumulative_sum
FROM mytable 
JOIN (SELECT @running_total := 0) r
GROUP BY TotalQuantity

【问题讨论】:

  • 您正在合并两种方法。要么在子查询中进行分组,在外部查询中添加变量,要么切换到仅使用一种或其他方法。
  • @davidchoo12 我怀疑 OP 的 mysql 版本是最新的
  • 另外,表需要主键。

标签: mysql


【解决方案1】:

进行累积和的可能是规范的 ANSI 标准方法是通过相关子查询。我在这里使用了一个包含您的基本查询的视图:

CREATE VIEW test AS
SELECT
    TotalQuantity AS DistinctTotalQuantity,
    COUNT(TotalQuantity) AS COUNTVALUE, 
FROM mytable 
WHERE StoreId = 210 AND ProdName = 'Tusq'
GROUP BY TotalQuantity

然后通过以下方式计算总和:

SELECT
    t1.DistinctTotalQuantity,
    t1.COUNTVALUE,
    (SELECT SUM(t2.COUNTVALUE) FROM test t2
     WHERE t2.DistinctTotalQuantity <= t1.DistinctTotalQuantity) AS cumulative_sum
FROM test t1;

我们可以尝试使用会话变量:

SET @total = 0;
SELECT
    DistinctTotalQuantity,
    COUNTVALUE,
    (@total := @total + COUNTVALUE) AS cumulative_sum
FROM test;

【讨论】:

  • 它看起来太昂贵的查询,我们不能用变量做同样的事情吗?
  • @JunedAnsari 如果需要,您可以使用会话变量来计算滚动总和。但是这里的部​​分性能问题是您需要在一个查询中进行聚合,然后进行滚动求和。这不是最有效的情况。
【解决方案2】:

以下查询将完美运行,并且不需要对您的查询/方法进行太多更改。虽然,我不太确定性能:

SELECT TotalQuantity AS DistinctTotalQuantity,
       COUNT(TotalQuantity) AS COUNTVALUE, 
       (select @running_total := @running_total + count(TotalQuantity) from mytable m 
     where m.TotalQuantity = m1.TotalQuantity) cumulative_sum
    FROM (select *from mytable order by TotalQuantity) m1
    JOIN (SELECT @running_total := 0) r
    GROUP BY m1.TotalQuantity;

如果要使用浮点值,请按如下方式声明列:

create table `mytable` (
    `TotalQuantity` Decimal (7,1)  //Here 1 is scale. It means 1 digit is allowed after decimal point.
)

这是我更新的Sqlfiddle

希望对你有帮助!

【讨论】:

  • 嘿,Harshil,如果值改变了,那就错了。 sqlfiddle.com/#!9/95166f/1
  • 你想把 1.5 算作单独的 ToatalQuantity 吗?
  • 答案被接受,所以我认为它正在工作,因此更新了我的答案。
【解决方案3】:
set @csum := 0;
update YourTable
set cumulative_sum = (@csum := @csum + count)
order by id;


set @csum := 0;
select id, count, (@csum := @csum + count) as cumulative_sum
from mytable
order by id;

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多