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


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


PS

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

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

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

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

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


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

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

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

— Мы сами знаем, что она не имеет решения, — сказал Хунта, немедленно ощетиниваясь. — Мы хотим знать, как её решать.
...
Рейтинг: 0 / 0
Как выбрать запросом строки с нужной суммой по определенному полю
    #39914678
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Один запросом не выйдет.
А вот, нашёл у нас, правильное решение?
запрос для подсчета суммы чисел и проверки соответствия суммы данному числу
...
Рейтинг: 0 / 0
Как выбрать запросом строки с нужной суммой по определенному полю
    #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
Как выбрать запросом строки с нужной суммой по определенному полю
    #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
Как выбрать запросом строки с нужной суммой по определенному полю
    #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
Как выбрать запросом строки с нужной суммой по определенному полю
    #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
Как выбрать запросом строки с нужной суммой по определенному полю
    #39914753
swkx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем откликнувшимся!
Гляну чуть позже. Сейчас совсем некогда.
...
Рейтинг: 0 / 0
Как выбрать запросом строки с нужной суммой по определенному полю
    #39917461
swkx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.

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

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

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

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

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

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

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

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


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

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

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

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


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