SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.05.2021 05:44:25

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Как получить сумму желаемого числа, комбинацию

Добрый день.
Прошу помочь с запросом, пытаюсь получить сумму желаемого числа 17404142.26
из таблицы docs c полями id, doc,docsum. В итоге получаю не все суммы числа. нужна одна из подходящих комбинаций.
Т.е. пример желаемая сумма 10, ее можно собрать из значений 1+2+3+4 = 10.
Комбинаций может быть много, но нужна одна которая дает эту сумму. Или не быть вообще, нужно точное совпадение.
Пытаюсь делать таким запросом:



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


Прикрепленные файлы:
Attachment Icon 123.sql, Размер: 704,719 байт, Скачано: 327

Неактивен

 

#2 21.05.2021 13:04:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Как получить сумму желаемого числа, комбинацию

У Вас в запросе есть нестрогое равенство - не вполне понятно, чего нужно.

На более упрощенном примере, если у нас данные в таблице

1
7
5
6
2

, то какой результат Вы хотите получить?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 21.05.2021 13:45:37

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

хочу получить 17404142.26

Неактивен

 

#4 21.05.2021 13:46:10

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

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

Неактивен

 

#5 21.05.2021 13:48:22

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

1
7
5
6
2

Желаемая сумма 8; 1+7 = 8; или 2+6 = 8

Неактивен

 

#6 21.05.2021 13:49:47

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

мне достаточно 1+7 = 8, все перебирать не нужно. Остановиться на одном варианте если он есть.

Неактивен

 

#7 21.05.2021 14:53:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как получить сумму желаемого числа, комбинацию

Для меня задачка выглядит больше по математике / программированию, чем на SQL-запросы. Ну то есть если объем данных небольшой, то можно просто вытащить куда-то в приложение, и там побегать.

Алгоритмически она решается, к сожалению, только полным перебором. Также не могу не заметить, что задача очень плохо поставлена, если там действительно числа с плавающей запятой. Из-за особенностей представления таких чисел в современных компьютерах, сравнение по равенству может работать не так, как Вы ожидаете:

> select * from foo;
+------+
| a    |
+------+
|  0.1 |
|  0.2 |
+------+
2 rows in set (0.00 sec)

> select sum(a) from foo;
+---------------------+
| sum(a)              |
+---------------------+
| 0.30000000447034836 |
+---------------------+
1 row in set (0.00 sec)

Неактивен

 

#8 22.05.2021 12:08:14

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

мне нужен только один результат все комбинации не нужны

Неактивен

 

#9 22.05.2021 12:31:56

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

для целых чисел это работает, делал по инструкции:
https://stackoverflow.com/questions/386 … tain-value

Неактивен

 

#10 22.05.2021 12:32:41

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

select id,doc,docsum
from docs t
where docsum+coalesce((select round(sum(docsum),2) from docs where docsum<t.docsum),0) <= 17404142.26
order by docsum

результат не поменялся

Неактивен

 

#11 22.05.2021 12:33:22

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

Неактивен

 

#12 22.05.2021 13:07:25

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

можете показать как это рекурсией сделать?

Неактивен

 

#13 24.05.2021 14:13:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как получить сумму желаемого числа, комбинацию

type-2019 написал:

Комбинаций может быть много, но нужна одна которая дает эту сумму. Или не быть вообще, нужно точное совпадение.
Пытаюсь делать таким запросом:

Таким запросом не получится. Он ищет не все строки сумма которых <= 17404142.26

А зачем нужно именно sql запросом решать задачу? Это плохой путь.

type-2019 написал:

можете показать как это рекурсией сделать?

См https://sqlinfo.ru/articles/info/40.html

Для вашего случая будет что-то вроде:

mysql> select * from test;
+----+---+
| id | a |
+----+---+
|  1 | 1 |
|  2 | 7 |
|  3 | 5 |
|  4 | 6 |
|  5 | 2 |
+----+---+
5 rows in set (0.00 sec)

mysql> with recursive cte as
    -> (
    -> select 0 as id, 0 as a, CAST(0 AS CHAR(1000)) AS list_id, CAST(0 AS CHAR(1000)) AS list_values
    -> union all
    -> select t.id, t.a + cte.a, concat(cte.list_id, ',', t.id), concat(cte.list_values, ' ', t.a)
    -> from test t, cte where cte.id <> t.id and  t.a + cte.a <= 8 and find_in_set(t.id, cte.list_id) = 0
    -> )
    -> select * from cte;
+------+------+---------+-------------+
| id   | a    | list_id | list_values |
+------+------+---------+-------------+
|    0 |    0 | 0       | 0           |
|    1 |    1 | 0,1     | 0 1         |
|    2 |    7 | 0,2     | 0 7         |
|    3 |    5 | 0,3     | 0 5         |
|    4 |    6 | 0,4     | 0 6         |
|    5 |    2 | 0,5     | 0 2         |
|    1 |    8 | 0,2,1   | 0 7 1       |
|    1 |    6 | 0,3,1   | 0 5 1       |
|    1 |    7 | 0,4,1   | 0 6 1       |
|    1 |    3 | 0,5,1   | 0 2 1       |
|    2 |    8 | 0,1,2   | 0 1 7       |
|    3 |    6 | 0,1,3   | 0 1 5       |
|    3 |    7 | 0,5,3   | 0 2 5       |
|    4 |    7 | 0,1,4   | 0 1 6       |
|    4 |    8 | 0,5,4   | 0 2 6       |
|    5 |    3 | 0,1,5   | 0 1 2       |
|    5 |    7 | 0,3,5   | 0 5 2       |
|    5 |    8 | 0,4,5   | 0 6 2       |
|    1 |    8 | 0,5,3,1 | 0 2 5 1     |
|    1 |    8 | 0,3,5,1 | 0 5 2 1     |
|    3 |    8 | 0,5,1,3 | 0 2 1 5     |
|    3 |    8 | 0,1,5,3 | 0 1 2 5     |
|    5 |    8 | 0,3,1,5 | 0 5 1 2     |
|    5 |    8 | 0,1,3,5 | 0 1 5 2     |
+------+------+---------+-------------+
24 rows in set (0.00 sec)

mysql> with recursive cte as
    -> (
    -> select 0 as id, 0 as a, CAST(0 AS CHAR(1000)) AS list_id, CAST(0 AS CHAR(1000)) AS list_values
    -> union all
    -> select t.id, t.a + cte.a, concat(cte.list_id, ',', t.id), concat(cte.list_values, ' ', t.a)
    -> from test t, cte where cte.id <> t.id and  t.a + cte.a <= 8 and find_in_set(t.id, cte.list_id) = 0
    -> )
    -> select list_id, list_values from cte where a = 8;
+---------+-------------+
| list_id | list_values |
+---------+-------------+
| 0,2,1   | 0 7 1       |
| 0,1,2   | 0 1 7       |
| 0,5,4   | 0 2 6       |
| 0,4,5   | 0 6 2       |
| 0,5,3,1 | 0 2 5 1     |
| 0,3,5,1 | 0 5 2 1     |
| 0,5,1,3 | 0 2 1 5     |
| 0,1,5,3 | 0 1 2 5     |
| 0,3,1,5 | 0 5 1 2     |
| 0,1,3,5 | 0 1 5 2     |
+---------+-------------+
10 rows in set (0.00 sec)
 

Неактивен

 

#14 24.05.2021 15:51:40

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

ага, спасибо. Постараюсь разобраться.  А для чего Id "0" вводится?

Неактивен

 

#15 24.05.2021 21:45:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как получить сумму желаемого числа, комбинацию

type-2019 написал:

ага, спасибо. Постараюсь разобраться.  А для чего Id "0" вводится?

Начальный элемент рекурсии (возможно, можно взять первый эл-т таблицы вместо нуля).
Рекомендую, посмотреть цикл статей от непосредственного разработчика - https://sqlinfo.ru/articles/info/40.html Очень хорошо изложено.

Неактивен

 

#16 26.05.2021 15:33:57

type-2019
Участник
Зарегистрирован: 08.11.2019
Сообщений: 14

Re: Как получить сумму желаемого числа, комбинацию

а как получить любой рандомный один результат?

Неактивен

 

#17 26.05.2021 22:59:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как получить сумму желаемого числа, комбинацию

добавьте  "limit 1"
если нужно именно рандомный, то - order by rand() limit 1

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson