Сумма Sqlite каждые 3 строки

У меня есть следующие данные в БД:

Захват1

Я хочу, чтобы данные выглядели следующим образом, используя SQLite: захват2

300 230 250 — это перенос итоговой строки из одной таблицы в БД, которая отображается как первая строка в соответствии с командой SQLite Select sum(Red), sum(Green), sum(Blue), за которой следуют новые записи из другой таблицы в БД с использованием Select Red, Green, Blue command. Теперь мне нужна новая сумма каждого столбца после 3 записей, СЛЕДУЮЩИЕ за повторением этой суммы, затем 3 записи, за которыми следует то же самое, и так далее и тому подобное. У меня есть 600 свежих записей, которые мне нужно отобразить таким образом. Спасибо

Что делать, если количество строк не кратно трем?

forpas 20.12.2020 19:37

Пожалуйста, прочитайте вики-информацию о теге, который вы использовали stackoverflow.com/tags/sqlite/info и предоставьте MRE, как описано там.

Yunnosch 20.12.2020 19:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте оконную функцию SUM(), чтобы получить частичные итоги. Создайте 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

Измените ? на количество рядов каждого ведра. Обратите внимание: поскольку в вашей таблице нет столбца, обозначающего порядок строк, которые я использую 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

Привет, forpas.. это хорошо работает, если есть 9 строк, с тремя строками между суммами.. если есть 10 строк, то я хочу, чтобы последняя и вторая последняя строки были пустыми. В вашем решении сумма появляется сразу после 10-й строки

harry 21.12.2020 06:04

Аналогичным образом, с 10 строками и строками из 4, изменив код ГДЕ (rn > 1) И ((rn - 1) % 3 = 0 ИЛИ (rn = (ВЫБЕРИТЕ МАКС(rn) ИЗ cte) на ГДЕ (rn > 1 ) И ((rn - 1) % 4 = 0 ИЛИ (rn = (SELECT MAX(rn) FROM cte), результат должен оставить 2 пустых строки перед последней суммой (4+4+2+2 пробела)..Спасибо

harry 21.12.2020 06:24

@harry публикует образцы данных и ожидаемые результаты для этого случая.

forpas 21.12.2020 09:30

@forpas...ваш результат слева, желаемый результат справа с 4 строками i.stack.imgur.com/SW7lL.jpg

harry 21.12.2020 10:54

Или ваш код используется для 9 строк с 4 строками между итогами i.stack.imgur.com/DgGAU.jpg

harry 21.12.2020 11:20

@forpas...фантастика..спасибо за ваше время и беспроблемные усилия и ответ..это очень сложный код, и я могу только начать понимать его тонкости..вы действительно Эксперт..

harry 21.12.2020 17:44

Другие вопросы по теме