DBに次のデータがあります。
SQLiteを使用してデータを次のように表示したい:capture2
300 230 250
は、DB内の1つのテーブルからの合計の繰り越し行であり、SQLiteSelect sum(Red), sum(Green), sum(Blue)
コマンドに従って最初の行として表示され、その後にSelect Red, Green, Blue command
。を使用してDB内の別のテーブルからの新しいエントリが続きます。ここで、3つのエントリの後に各列の新しい合計が必要です。その後にこの合計を繰り返し、次に3つのエントリの後に同じものを続けます。600個の新しいエントリがあり、この方法で表示する必要があります。ありがとう
部分的な合計を取得するには、ウィンドウ関数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]
コメントを追加