我有下表;
我想得到 和 之间序列的col1总和col2。因此,例如第一行应该是sum(7,8,9,10,11,12). 类似的东西sum(seq(col1,col2))。
你能帮我用MySQL写这个吗?
我有下表;
我想得到 和 之间序列的col1总和col2。因此,例如第一行应该是sum(7,8,9,10,11,12). 类似的东西sum(seq(col1,col2))。
你能帮我用MySQL写这个吗?
我们知道 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;
如果您的表格也没有某种 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 中生成序列表,但这可能是另一个问题的主题。
像这样的东西:
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
对于您的具体情况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