Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как выбрать запросом строки с нужной суммой по определенному полю / 20 сообщений из 20, страница 1 из 1
15.01.2020, 19:56
    #39914549
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
Привет.
Например есть таблица как на картинке. Нужно выбрать строки с суммой = 5
Должны быть выбраны строки 1 и 4
Или, например, нужно выбрать строки с суммой = 6
Должны быть выбраны строки 2 и 4
...
Рейтинг: 0 / 0
15.01.2020, 20:11
    #39914558
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx
Например есть таблица как на картинке. Нужно выбрать строки с суммой = 5
Должны быть выбраны строки 1 и 4
Или, например, нужно выбрать строки с суммой = 6
Должны быть выбраны строки 2 и 4
То есть всегда нужно выбрать 2 строки? Или количество может быть любое?
И если есть несколько вариантов, то нужно показать все, или достаточно одного?
...
Рейтинг: 0 / 0
15.01.2020, 20:16
    #39914560
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
Количество строк в выборке любое.
Если возможны разные комбинации, то подойдет любая из них.
Я вроде давно с запросами работаю, но вот что-то споткнулся на такой задачке.
...
Рейтинг: 0 / 0
15.01.2020, 20:21
    #39914562
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx
Количество строк в выборке любое.
Если возможны разные комбинации, то подойдет любая из них.
Я вроде давно с запросами работаю, но вот что-то споткнулся на такой задачке.


Эта задача решается только полным перебором всех возможных вариантов, например, для вашего условия (сумма = 6) второй ответ 1, 2, 3


PS

ищите по ключевым словам: "Задача о рюкзаке" + "SQL"
...
Рейтинг: 0 / 0
15.01.2020, 20:32
    #39914566
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
msLex,

полным перебором неинтересно, хотя возможно, конечно, тем более исходные таблицы небольшие, не больше сотни строк

хотелось бы красиво одним запросом
...
Рейтинг: 0 / 0
15.01.2020, 20:37
    #39914568
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx
msLex,

полным перебором неинтересно, хотя возможно, конечно, тем более исходные таблицы небольшие, не больше сотни строк

хотелось бы красиво одним запросом


Еще раз, ваша задача, это вариант известной "Задаче о рюкзаке".
Варианты ее решения гуглятся.
Один запросом не выйдет.
...
Рейтинг: 0 / 0
15.01.2020, 20:51
    #39914569
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
msLex,

Ну нет так нет. Спасибо!

Утешает тот факт, что если бы решение с одним запросом существовало, а я о нем не знал, было бы печально.
...
Рейтинг: 0 / 0
16.01.2020, 06:00
    #39914618
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
— Голубчики, — сказал Фёдор Симеонович озабоченно, разобравшись в почерках. — Это же проблема Бен Бецалеля. Калиостро же доказал, что она не имеет решения.

— Мы сами знаем, что она не имеет решения, — сказал Хунта, немедленно ощетиниваясь. — Мы хотим знать, как её решать.
...
Рейтинг: 0 / 0
16.01.2020, 10:20
    #39914678
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
msLex
Один запросом не выйдет.
А вот, нашёл у нас, правильное решение?
запрос для подсчета суммы чисел и проверки соответствия суммы данному числу
...
Рейтинг: 0 / 0
16.01.2020, 10:43
    #39914698
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
DECLARE @sum INT = 4;

DECLARE @t AS TABLE
                    (a  VARCHAR(3) NOT NULL
                   , b  VARCHAR(3) NOT NULL
                   , id INT NOT NULL PRIMARY KEY CLUSTERED
                    );

INSERT INTO @t(a, b, id)    
SELECT 'a1', 'b1' , 1 UNION ALL 
SELECT 'a2', 'b2' , 2 UNION ALL 
SELECT 'a3', 'b3' , 3 UNION ALL 
SELECT 'a4', 'b4' , 4 UNION ALL 
SELECT 'a5', 'b5' , 5 UNION ALL 
SELECT 'a6', 'b6' , 6 UNION ALL 
SELECT 'a7', 'b7' , 7 UNION ALL 
SELECT 'a8', 'b8' , 8 UNION ALL 
SELECT 'a9', 'b9' , 9 UNION ALL 
SELECT 'a10', 'b10' , 10 UNION ALL 
SELECT 'a11', 'b11' , 11 UNION ALL 
SELECT 'a12', 'b12' , 12 UNION ALL 
SELECT 'a13', 'b13' , 13 UNION ALL 
SELECT 'a14', 'b14' , 14 UNION ALL 
SELECT 'a15', 'b15' , 15 UNION ALL 
SELECT 'a16', 'b16' , 16

-- Попарно по горизонтали
SELECT 
       a.id
     , b.id
FROM 
     @t AS a
     CROSS JOIN @t AS b
WHERE a.id + b.id = @sum;

-- Попарно по вертикали
SELECT 
    z.a
FROM 
     @t AS a
     CROSS JOIN @t AS b
     CROSS APPLY (VALUES(a.id), (b.id), (NULL)) AS z(a)
WHERE a.id + b.id = @sum;
...
Рейтинг: 0 / 0
16.01.2020, 11:24
    #39914722
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
DECLARE @sum INT = 4;

DECLARE @t AS TABLE
                    (a  VARCHAR(3) NOT NULL
                   , b  VARCHAR(3) NOT NULL
                   , id INT NOT NULL PRIMARY KEY CLUSTERED
                    );

INSERT INTO @t(a, b, id)    
SELECT 'a1', 'b1' , 1 UNION ALL 
SELECT 'a2', 'b2' , 2 UNION ALL 
SELECT 'a3', 'b3' , 3 UNION ALL 
SELECT 'a4', 'b4' , 4 UNION ALL 
SELECT 'a5', 'b5' , 5 UNION ALL 
SELECT 'a6', 'b6' , 6 UNION ALL 
SELECT 'a7', 'b7' , 7 UNION ALL 
SELECT 'a8', 'b8' , 8 UNION ALL 
SELECT 'a9', 'b9' , 9 UNION ALL 
SELECT 'a10', 'b10' , 10 UNION ALL 
SELECT 'a11', 'b11' , 11 UNION ALL 
SELECT 'a12', 'b12' , 12 UNION ALL 
SELECT 'a13', 'b13' , 13 UNION ALL 
SELECT 'a14', 'b14' , 14 UNION ALL 
SELECT 'a15', 'b15' , 15 UNION ALL 
SELECT 'a16', 'b16' , 16

-- Попарно по горизонтали
SELECT 
       a.id
     , b.id
FROM 
     @t AS a
     CROSS JOIN @t AS b
WHERE a.id != b.id AND a.id + b.id = @sum;

-- Попарно по вертикали
SELECT 
    z.a
FROM 
     @t AS a
     CROSS JOIN @t AS b
     CROSS APPLY (VALUES(a.id), (b.id), (NULL)) AS z(a)
WHERE a.id != b.id AND a.id + b.id = @sum;
...
Рейтинг: 0 / 0
16.01.2020, 11:28
    #39914724
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
alexeyvg
msLex
Один запросом не выйдет.
А вот, нашёл у нас, правильное решение?
запрос для подсчета суммы чисел и проверки соответствия суммы данному числу


Я не очень знаком с ораклом, но по тексту (и смыслу) похоже на рекурсивный CTE с перебором всех возможных "путей" сбора суммы.
Для сколь-нибудь значимой выборки будет тормозить безбожно.



entrypoint
swkx,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
DECLARE @sum INT = 4;

DECLARE @t AS TABLE
                    (a  VARCHAR(3) NOT NULL
                   , b  VARCHAR(3) NOT NULL
                   , id INT NOT NULL PRIMARY KEY CLUSTERED
                    );

INSERT INTO @t(a, b, id)    
SELECT 'a1', 'b1' , 1 UNION ALL 
SELECT 'a2', 'b2' , 2 UNION ALL 
SELECT 'a3', 'b3' , 3 UNION ALL 
SELECT 'a4', 'b4' , 4 UNION ALL 
SELECT 'a5', 'b5' , 5 UNION ALL 
SELECT 'a6', 'b6' , 6 UNION ALL 
SELECT 'a7', 'b7' , 7 UNION ALL 
SELECT 'a8', 'b8' , 8 UNION ALL 
SELECT 'a9', 'b9' , 9 UNION ALL 
SELECT 'a10', 'b10' , 10 UNION ALL 
SELECT 'a11', 'b11' , 11 UNION ALL 
SELECT 'a12', 'b12' , 12 UNION ALL 
SELECT 'a13', 'b13' , 13 UNION ALL 
SELECT 'a14', 'b14' , 14 UNION ALL 
SELECT 'a15', 'b15' , 15 UNION ALL 
SELECT 'a16', 'b16' , 16

-- Попарно по горизонтали
SELECT 
       a.id
     , b.id
FROM 
     @t AS a
     CROSS JOIN @t AS b
WHERE a.id != b.id AND a.id + b.id = @sum;

-- Попарно по вертикали
SELECT 
    z.a
FROM 
     @t AS a
     CROSS JOIN @t AS b
     CROSS APPLY (VALUES(a.id), (b.id), (NULL)) AS z(a)
WHERE a.id != b.id AND a.id + b.id = @sum;



swkx
Количество строк в выборке любое.
...
Рейтинг: 0 / 0
16.01.2020, 11:51
    #39914737
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx
хотелось бы красиво одним запросом
Красота у каждого своя.
А одним запросом можно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
declare @t table (a varchar(10), b varchar(10), v int);
declare @target_sum int = 6;

insert into @t
values
 ('a1', 'b1' , 1),
 ('a2', 'b2' , 2),
 ('a3', 'b3' , 3),
 ('a4', 'b4' , 4);

with a as
(
 select
  a, b, v,
  right(space(10) + a, 10) + right(space(10) + b, 10) as k,
  cast('(' + a + ', ' + b + ')' as varchar(max)) as k_path
 from
  @t
),
b as
(
 select a, b, v, k, k_path, v as sum_v from a

 union all

 select
  a.a, a.b, a.v, a.k, b.k_path + a.k_path, b.sum_v + a.v
 from
  b join
  a on a.k > b.k
)
select k_path, sum_v from b where sum_v = @target_sum;
...
Рейтинг: 0 / 0
16.01.2020, 12:27
    #39914753
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
Спасибо всем откликнувшимся!
Гляну чуть позже. Сейчас совсем некогда.
...
Рейтинг: 0 / 0
22.01.2020, 17:06
    #39917461
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
День добрый.

Вроде как цель достигнута.

Я так понял, что ключевой момент во всей этой затее это условие соединения таблицы с этой же таблицей.
в общем виде выглядящее как Таблица2.ИдСтроки > Таблица1.ИдСтроки

В моем случае быстрее получается, если искать комбинацию строк с нужной суммой по шагам,
т.е. организовать цикл от 2 до 6

Шаг 1. формируем запрос с двумя таблицами и ищем сумму двух строк
Шаг 2. формируем запрос с тремя таблицами и ищем сумму трех строк
и т.д.

при соединении семи таблиц и около сотни строк в исходной таблице уже ощутимые тормоза

Еще раз спасибо.
...
Рейтинг: 0 / 0
05.02.2020, 21:25
    #39923124
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
Привет.

Всё-таки перебор с некоторой оптимизацией оказался намного эффективнее решения с запросом.
Даже не в разы, а на порядки быстрее.

Для исходной таблицы примерно в сотню строк и искомой суммой, которая насобирается примерно в 30 строках, перебор выдает результат через 2-3 сек, запрос же намертво умирает.
...
Рейтинг: 0 / 0
06.02.2020, 12:43
    #39923332
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx,


Если у вас есть готовое решение, выложите скрипт.
Пригодиться тому, кто будет решать подобную задачу.
...
Рейтинг: 0 / 0
06.02.2020, 14:24
    #39923435
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
Да мне в общем-то не жалко, но:

Вряд ли у меня самый эффективный алгоритм. И как кто-то выше заметил, варианты решения гуглятся.

Я с 1С работаю, поэтому в этой ветке вряд ли уместен мой код. Тем более вопрос к SQL уже не имеет никакого отношения.
...
Рейтинг: 0 / 0
06.02.2020, 14:31
    #39923441
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
swkx
Я с 1С работаю, поэтому в этой ветке вряд ли уместен мой код. Тем более вопрос к SQL уже не имеет никакого отношения.

Если у вас не TSQL код, тогда конечно нет смысла его постить
Если же все же TSQL и он быстрее предложенных выше, то почему бы и нет.
...
Рейтинг: 0 / 0
06.02.2020, 15:33
    #39923489
swkx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать запросом строки с нужной суммой по определенному полю
Конечно, не TSQL. Алгоритм могу описать, если кому интересно.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как выбрать запросом строки с нужной суммой по определенному полю / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]