Sqlite每3行求和

Sqlite每3行求和,sqlite,Sqlite,我在DB中有以下数据: 我想使用SQLite使数据显示如下: 300 230 250是数据库中一个表中总计的结转行,根据SQLite Select sumRed、SUMGREN、sumBlue命令显示为第一行,然后使用Select Red、Green、Blue命令从数据库中的另一个表中显示新条目。 现在,我想要一个新的总计,每个列在3个条目之后,然后重复这个总计,然后是3个条目,然后是相同的,以此类推。 我有600个新条目,需要以这种方式显示。谢谢使用窗口函数SUM获得部分总计。 为部分总计创

我在DB中有以下数据:

我想使用SQLite使数据显示如下:

300 230 250是数据库中一个表中总计的结转行,根据SQLite Select sumRed、SUMGREN、sumBlue命令显示为第一行,然后使用Select Red、Green、Blue命令从数据库中的另一个表中显示新条目。 现在,我想要一个新的总计,每个列在3个条目之后,然后重复这个总计,然后是3个条目,然后是相同的,以此类推。
我有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的期望结果…太棒了…感谢您的时间和无缝的努力与响应…这是一个非常复杂的代码,我只能开始理解它的复杂性…您真是一位专家。。