Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти заданную сумму  [new]
Len4ick
Member

Откуда:
Сообщений: 168
Добрый день. Есть таблица, в которой указаны клиенты и суммы их переводов. Необходимо найти 2 перевода, (не обязательно различных клиентов), у которых общая сумма будет 600
with TEST AS(
select 'AAA'	AS Client,	100 AS Summa	union all
select 'AAA',			500		union all
select 'AAA',			300		union all
select 'BBB',			200		union all
select 'BBB',			800		union all
select 'CCC',			100		union all
select 'DDDD',			900		union all
select 'EEE',			400		
)


Результат:
Клиент1 Клиент2
AAA AAA
AAA CCC
BBB EEE
28 июл 14, 17:43    [16367721]     Ответить | Цитировать Сообщить модератору
 Re: Найти заданную сумму  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Len4ick,

во-первых, без PK задача не имеет решения;
во-вторых, такой суммы может и вообще не быть.
with TEST AS(
select 1 PK, 'AAA' Client,	100 Summa	union all
select 2,'AAA',			500		union all
select 3,'AAA',			300		union all
select 4,'BBB',			200		union all
select 5,'BBB',			800		union all
select 6,'CCC',			100		union all
select 7,'DDDD',			900		union all
select 8,'EEE',			400		
)
SELECT T1.PK PK1, T1.Client Client1, T1.Summa Summa1, T2.PK PK2, T2.Client Client2,T2.Summa Summa2
FROM TEST T1 JOIN TEST T2 ON T1.PK<T2.PK WHERE T1.Summa+T2.Summa=600;
28 июл 14, 18:36    [16367966]     Ответить | Цитировать Сообщить модератору
 Re: Найти заданную сумму  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Ну да, где-то так.
with TEST AS(
select 'AAA'	AS Client,	100 AS Summa	union all
select 'AAA',			500		union all
select 'AAA',			300		union all
select 'BBB',			200		union all
select 'BBB',			800		union all
select 'CCC',			100		union all
select 'DDDD',			900		union all
select 'EEE',			400		
),
T AS (SELECT ROW_NUMBER() OVER (ORDER BY Client, Summa) AS RowNumber, Client, Summa FROM TEST)
SELECT T1.Client, T2.Client FROM T AS T1 CROSS JOIN T AS T2
WHERE T1.Summa + T2.Summa = 600 AND T1.RowNumber < T2.RowNumber
28 июл 14, 18:40    [16367990]     Ответить | Цитировать Сообщить модератору
 Re: Найти заданную сумму  [new]
Len4ick
Member

Откуда:
Сообщений: 168
Спасибо.
29 июл 14, 09:14    [16369400]     Ответить | Цитировать Сообщить модератору
 Re: Найти заданную сумму  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
with TEST AS(
select 'AAA'	AS Client,	100 AS Summa	union all
select 'AAA',			500		union all
select 'AAA',			300		union all
select 'BBB',			200		union all
select 'BBB',			800		union all
select 'CCC',			100		union all
select 'DDDD',			900		union all
select 'EEE',			400		
)

SELECT DISTINCT CASE WHEN t.Client <= t2.Client THEN t.Client ELSE t2.Client END, 
CASE WHEN t.Client > t2.Client THEN t.Client ELSE t2.Client END
  FROM TEST t
CROSS JOIN TEST t2
WHERE t2.Summa + t.Summa = 600


ps может побыстрее чуть будет
29 июл 14, 12:40    [16370593]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить