Комбинации сумм слагаемых
Прошу помочь с запросом, пытаюсь получить сумму желаемого числа 17404142.26 из таблицы docs c полями id, doc,docsum. В итоге получаю не все суммы числа. нужна одна из подходящих комбинаций. Т.е. пример желаемая сумма 10, ее можно собрать из значений 1+2+3+4 = 10. Комбинаций может быть много, но нужна одна которая дает эту сумму. Или не быть вообще, нужно точное совпадение. Пытаюсь делать таким запросом:
SQL
SELECT id,doc,docsum
FROM docs t
WHERE docsum+COALESCE((SELECT SUM(docsum) FROM docs WHERE docsum<t.docsum),0) <= 17404142.26
ORDER BY docsum
Итог: (61 запись, только сумма 1029341)
0.01 1.73 10002.9 10005.6 10017.59 100205.85 1002104.89 10026.85 1002676 100434.03 10044.83 100466.68 100474.56 100480.61 100488.2 1005352.96 1006.83 100605.31 100674.7 100678.94 100764.06 100769.27 100769.64 10087.06 100913.46 1009559.56 10097.74 10112.35 1011368.38 101157.33 10121.15 10121.76 1012195.78 101311.54 1013165.62 101429.65 101430.69 1015008.48 10152.72 1015400.29 101581.51 101647.72 101675.06 1019.39 101990.06 10205.46 1021.03 1021.58 1021317.57 1021377.42 1021492.97 102245.47 102295.15 102325.74 1024.73 1024068.58 10243.56 102458.45 102526.26 1025288.6 10258.8
Ответы (2 шт):
Пример решения задачи с использованием рекурсивного CTE. Диалект MySQL 8+
WITH RECURSIVE
cte AS ( SELECT id, CONCAT_WS(',', id) kit, val summ
FROM test
UNION ALL
SELECT test.id, CONCAT_WS(',', test.id, cte.kit), cte.summ + test.val
FROM cte
JOIN test ON cte.id > test.id
WHERE cte.summ + test.val <= @sum )
SELECT kit, summ
FROM cte
WHERE summ = @sum;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f90a126cee6598ce68b00985e73cef49
Для справки - в данном fiddle CTE из 9 значений исходной таблицы генерируют 232 выходные записи (а теоретически максимальное количество - 511). С увеличением количества записей в таблице количество генерируемых записей растёт ну очень быстро...
Использую базу SQlite необходимо получить только один любой вариант, в вашем запросе
используете CONCAT_WS данной функции нет в Sqlite, подскажите как переписать.
Моя таблица: CREATE TABLE docs ( id INTEGER PRIMARY KEY, number TEXT NOT NULL, total REAL NOT NULL )