Автор: Artix (user.su)
Задача:
Есть таблица из 3-х полей: идентификатор части объекта, вес этой части,
и признак повторения стоки данных. Нужно найти суммарный вес объекта (всех строк),
но повторяющиеся строки суммировать только 1 раз.
CREATE TABLE TEST (
part_id INTEGER,
weight XPART,
dup BOOLEAN
);
Данные
1 20 false
2 30 true
3 40 false
4 10 true
4 10 true
2 30 true
Ожидаемый ответ: сумма весов = 100
Решение 1 - очевидное, способом деления таблицы по признаку повторяемости:
SELECT SUM(X) FROM (
SELECT part_id, MAX(weight) as X FROM TEST WHERE dup=TRUE GROUP BY 1
UNION ALL
SELECT part_id, SUM(weight) FROM TEST WHERE dup=FALSE GROUP BY 1
) T
Решение 2 - с помощью оконной функции:
SELECT SUM(X) FROM (
SELECT IIF(
ROW_NUMBER() OVER (PARTITION BY part_id ORDER BY part_id, dup) = 1, weight, 0
) as X FROM TEST
) T
Решение 3 - с помощью одной группировки:
SELECT SUM(X) FROM (
SELECT PART_ID,DUP,SUM(PART_VALUE)/IIF(DUP=true,SUM(1),1) as X
FROM TEST
GROUP BY PART_ID,DUP
)
или
SELECT SUM(X) FROM (
SELECT PART_ID,DUP,SUM(PART_VALUE)/IIF(DUP=true,COUNT(*),1) as X
FROM TEST
GROUP BY PART_ID,DUP
)
# SQL Справочник v0.05 © 2007-2026 Igor Salnikov aka SunDoctor