3行ごとのSqliteの合計

ハリー

DBに次のデータがあります。

キャプチャ1

SQLiteを使用してデータを次のように表示したい:capture2

300 230 250は、DB内の1つのテーブルからの合計の繰り越し行であり、SQLiteSelect sum(Red), sum(Green), sum(Blue)コマンドに従って最初の行として表示され、その後にSelect Red, Green, Blue commandを使用してDB内の別のテーブルからの新しいエントリが続きますここで、3つのエントリの後に各列の新しい合計が必要です。その後にこの合計を繰り返し、次に3つのエントリの後に同じものを続けます。600個の新しいエントリがあり、この方法で表示する必要があります。ありがとう

forpas

部分的な合計を取得するには、ウィンドウ関数SUM()を使用します。
部分合計のCTEを作成して、最後の合計を除いて2倍にし、テーブルの行でUNIONALLを使用して最終結果を返します。

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

?各バケットの行数で変更します。
テーブルには、使用する行の順序を示す列がないことに注意してくださいrowid

デモをご覧ください
結果(バケット内の4行の場合):

>  Red | Green | Blue
> ---: | ----: | ---:
>  300 |   230 |  250
>    5 |     6 |    4
>    4 |     3 |    2
>    4 |     3 |    5
>    6 |     5 |    4
>  319 |   247 |  265
>  319 |   247 |  265
>    4 |     5 |    6
>    3 |     6 |    7
>    2 |     5 |    6
>    5 |     4 |    3
>  333 |   267 |  287
>  333 |   267 |  287
>    3 |     9 |   12
>      |       |                
>      |       |                
>      |       |                
>  336 |   276 |  299

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事