1

我有下表;

在此处输入图像描述

我想得到 和 之间序列的col1总和col2。因此,例如第一行应该是sum(7,8,9,10,11,12). 类似的东西sum(seq(col1,col2))

你能帮我用MySQL写这个吗?

4

4 回答 4

3

我们知道 N 个自然数的总和是n * (n + 1) / 2。使用相同的概念来确定列的总和。

假设 col1 = 6 和 col2 = 8,如评论 col1 < col2 中所述,所以答案是

Sum = Sum of (8) natural numbers - Sum of (6-1) natural numbers

SELECT
    id,
    col1, 
    col2,
    (col2 * (col2 + 1) / 2) - ((col1 - 1) * col1 /2) Sum_Of_Col1_Col2
FROM table_name;
于 2019-09-04T13:59:03.153 回答
1

如果您的表格也没有某种 ID 或其他唯一列,您的问题可能有点难以解决,所以让我们先添加一下:

id | col1 | col2
1  | 7    | 12
2  | 8    | 10
3  | 6    | 8

我们可以通过“日历表”方法来处理这个问题,在这种情况下,日历表只包含一个从 1 到值可以得到多大的序列。例如,在 MySQL 8+ 中,我们可以尝试:

WITH nums AS (
    SELECT 1 AS val UNION ALL
    SELECT 2 UNION ALL
    ...
    SELECT 12
)

SELECT
    t.id,
    SUM(n.val) AS sum
FROM yourTable t
LEFT JOIN nums n
    ON n.val BETWEEN t.col1 AND t.col2
GROUP BY
    t.id
ORDER BY
    t.id;

在此处输入图像描述

演示

请注意,除了原始 CTE 之外,还有更好的方法在 MySQL 中生成序列表,但这可能是另一个问题的主题。

于 2019-09-04T13:38:38.937 回答
1

像这样的东西:

SELECT CASE WHEN MOD((col2-col1)/2)>0 THEN (col1+col2)*(col2-col1+1)/2 ELSE (col1+col2)*(col2-col1)/2+(col2+col1)/2 END AS col_sum
FROM yourTable
于 2019-09-04T13:41:12.903 回答
1

对于您的具体情况col2 > col1,有一个公式可以总结两个数字之间的算术级数。我已经在下面实现了

select ((col2−col1+1)*(col1+col2))/2 end as seq_sum
from your_table

也可以表示为:

select (square(col2)-square(col1)+col1+col2)/2 end as seq_sum
from your_table
于 2019-09-04T14:27:12.937 回答