Автор: 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-2025 Igor Salnikov aka SunDoctor