У меня есть следующие данные в БД:
Захват1
Я хочу, чтобы данные выглядели следующим образом, используя SQLite: захват2
300 230 250 — это перенос итоговой строки из одной таблицы в БД, которая отображается как первая строка в соответствии с командой SQLite Select sum(Red), sum(Green), sum(Blue), за которой следуют новые записи из другой таблицы в БД с использованием Select Red, Green, Blue command. Теперь мне нужна новая сумма каждого столбца после 3 записей, СЛЕДУЮЩИЕ за повторением этой суммы, затем 3 записи, за которыми следует то же самое, и так далее и тому подобное. У меня есть 600 свежих записей, которые мне нужно отобразить таким образом. Спасибо
Пожалуйста, прочитайте вики-информацию о теге, который вы использовали stackoverflow.com/tags/sqlite/info и предоставьте MRE, как описано там.
Используйте оконную функцию 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-й строки
Аналогичным образом, с 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 публикует образцы данных и ожидаемые результаты для этого случая.
@forpas...ваш результат слева, желаемый результат справа с 4 строками i.stack.imgur.com/SW7lL.jpg
Или ваш код используется для 9 строк с 4 строками между итогами i.stack.imgur.com/DgGAU.jpg
@forpas...фантастика..спасибо за ваше время и беспроблемные усилия и ответ..это очень сложный код, и я могу только начать понимать его тонкости..вы действительно Эксперт..
Что делать, если количество строк не кратно трем?