Sqlite每3行求和
我在DB中有以下数据: 我想使用SQLite使数据显示如下: 300 230 250是数据库中一个表中总计的结转行,根据SQLite Select sumRed、SUMGREN、sumBlue命令显示为第一行,然后使用Select Red、Green、Blue命令从数据库中的另一个表中显示新条目。 现在,我想要一个新的总计,每个列在3个条目之后,然后重复这个总计,然后是3个条目,然后是相同的,以此类推。Sqlite每3行求和,sqlite,Sqlite,我在DB中有以下数据: 我想使用SQLite使数据显示如下: 300 230 250是数据库中一个表中总计的结转行,根据SQLite Select sumRed、SUMGREN、sumBlue命令显示为第一行,然后使用Select Red、Green、Blue命令从数据库中的另一个表中显示新条目。 现在,我想要一个新的总计,每个列在3个条目之后,然后重复这个总计,然后是3个条目,然后是相同的,以此类推。 我有600个新条目,需要以这种方式显示。谢谢使用窗口函数SUM获得部分总计。 为部分总计创
我有600个新条目,需要以这种方式显示。谢谢使用窗口函数SUM获得部分总计。 为部分总计创建CTE,以便除了最后一个之外,将CTE加倍,并将UNION ALL与表中的行一起使用以返回最终结果:
WITH
cte AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY rowid) rn ,
SUM(Red) OVER (ORDER BY rowid) sum_red,
SUM(Green) OVER (ORDER BY rowid) sum_green,
SUM(Blue) OVER (ORDER BY rowid) sum_blue
FROM tablename
),
totals1 AS (
SELECT rn, sum_red, sum_green, sum_blue
FROM cte
WHERE (rn > 1) AND ((rn - 1) % ? = 0 OR (rn = (SELECT MAX(rn) FROM cte)))
),
totals2 AS (
SELECT * FROM totals1
UNION ALL
SELECT * FROM totals1
WHERE rn < (SELECT MAX(rn) FROM totals1)
),
empty AS (
SELECT 1 col, null Red, null Green, null Blue
WHERE (SELECT (COUNT(*) - 1) % ? FROM tablename) > 0
UNION ALL
SELECT col + 1, null, null, null
FROM empty
WHERE col < ? - (SELECT (COUNT(*) - 1) % ? FROM tablename)
)
SELECT Red, Green, Blue
FROM (
SELECT 1 ord, rn, Red, Green, Blue FROM cte
UNION ALL
SELECT 2, (SELECT COUNT(*) FROM tablename), Red, Green, Blue
FROM empty
UNION ALL
SELECT 3, rn, sum_red, sum_green, sum_blue FROM totals2
)
ORDER BY rn, ord
使用窗口函数SUM获取部分总计。 为部分总计创建CTE,以便除了最后一个之外,将CTE加倍,并将UNION ALL与表中的行一起使用以返回最终结果:
WITH
cte AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY rowid) rn ,
SUM(Red) OVER (ORDER BY rowid) sum_red,
SUM(Green) OVER (ORDER BY rowid) sum_green,
SUM(Blue) OVER (ORDER BY rowid) sum_blue
FROM tablename
),
totals1 AS (
SELECT rn, sum_red, sum_green, sum_blue
FROM cte
WHERE (rn > 1) AND ((rn - 1) % ? = 0 OR (rn = (SELECT MAX(rn) FROM cte)))
),
totals2 AS (
SELECT * FROM totals1
UNION ALL
SELECT * FROM totals1
WHERE rn < (SELECT MAX(rn) FROM totals1)
),
empty AS (
SELECT 1 col, null Red, null Green, null Blue
WHERE (SELECT (COUNT(*) - 1) % ? FROM tablename) > 0
UNION ALL
SELECT col + 1, null, null, null
FROM empty
WHERE col < ? - (SELECT (COUNT(*) - 1) % ? FROM tablename)
)
SELECT Red, Green, Blue
FROM (
SELECT 1 ord, rn, Red, Green, Blue FROM cte
UNION ALL
SELECT 2, (SELECT COUNT(*) FROM tablename), Red, Green, Blue
FROM empty
UNION ALL
SELECT 3, rn, sum_red, sum_green, sum_blue FROM totals2
)
ORDER BY rn, ord
如果行数不是3的倍数,该怎么办?请阅读您使用的标记的标记wiki信息,并提供此处所述的MRE。如果行数不是3的倍数,该怎么办?请阅读您使用的标记的标记wiki信息,并提供此处所述的MRE。Hi forpas..如果有9行,总计之间有3行..如果有10行,那么我希望最后一行和最后第二行为空。在您的解决方案中,total将立即出现在第10行之后,类似地,10行和4行,通过将代码(其中rn>1,rn-1%3=0或rn=SELECT MAXrn FROM cte)更改为其中rn>1,rn-1%4=0或rn=SELECT MAXrn FROM cte,结果应在最后一次总计4+4+2+2行之前保留2行空行。。Thanks@harry发布该案例的样本数据和预期结果。@forpas…左边是您的结果,右边是4行@forpas的期望结果…太棒了。感谢您的时间和无缝的努力与响应。这是一个非常复杂的代码,我只能开始理解它的复杂性。您真是一位专家。嗨,forpas。如果共有9行,共有3行,效果很好。如果共有10行,然后我希望最后一行和最后第二行为空。在您的解决方案中,total将立即出现在第10行之后,类似地,10行和4行,通过将代码(其中rn>1,rn-1%3=0或rn=SELECT MAXrn FROM cte)更改为其中rn>1,rn-1%4=0或rn=SELECT MAXrn FROM cte,结果应在最后一次总计4+4+2+2行之前保留2行空行。。Thanks@harry发布该案例的样本数据和预期结果。@forpas…左边是您的结果,右边4行@forpas的期望结果…太棒了…感谢您的时间和无缝的努力与响应…这是一个非常复杂的代码,我只能开始理解它的复杂性…您真是一位专家。。