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

Откуда:
Сообщений: 7
Помогите пожалуйста решить задачу.
Найти все полностью оплаченные заказы. Заказы оплачиваются в порядке очередности по мере поступления заказа.

declare @customers table (id int, name varchar(20))
declare @orders table (id int, summa numeric(18,2), customerId int)
declare @payments table (customerId int, payment numeric(18,2))

insert @customers (id, name)
values
(1, 'Первый'),
(2, 'Второй'),
(3, 'Третий'),
(4, 'Четвертый')

insert @orders (id, summa, customerId)
values
(1, 10, 1),
(2, 15, 1),
(3, 20, 1),
(4, 25, 1),
(5, 12, 2),
(6, 14, 2),
(7, 200, 2),
(8, 100, 3),
(9, 200, 3)
insert @payments (customerId, payment)
values
(1, 30),
(2, 500),
(3, 100),
(4, 20)
8 дек 15, 16:54    [18531146]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
a_voronin
Member

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

GROUP BY customerId
HAVING SUM(payments) >= SUM(summa)


А вот что выше уж додуматесь сами.
8 дек 15, 17:04    [18531230]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
NatalieZholob
Member

Откуда:
Сообщений: 7
a_voronin,

к сожалению что-то не получается у меня правильно додумать что должно быть перед этими строками. так как результат получается не тот. Таблицы payments и orders я объединяю по join. Похоже что это не правильно т.к. SUM(payment) для customerId =1 у меня получается 120 , а это не правильно.

Если есть возможность подскажите что надо сделать)))
8 дек 15, 19:14    [18531906]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
NatalieZholob
Если есть возможность подскажите что надо сделать)))
https://www.sql.ru/forum/1018035/zadachka-pro-yabloki-ili-sliyanie-2h-tablic
8 дек 15, 19:22    [18531949]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
NatalieZholob
Member

Откуда:
Сообщений: 7
invm,

спасибо сейчас попробую
8 дек 15, 21:13    [18532455]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
Добрый Э - Эх
Guest
NatalieZholob,

что должно получится на выходе ? покажи на примере своих же тестовых данных.
9 дек 15, 05:01    [18533031]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
Добрый Э - Эх
Guest
NatalieZholob,

версия сервера какая?
9 дек 15, 05:10    [18533036]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
Добрый Э - Эх
Guest
NatalieZholob, лишнее поля в итоговом выводе уберешь, если что...

declare @customers table (id int, name varchar(20))
declare @orders table (id int, summa numeric(18,2), customerId int)
declare @payments table (customerId int, payment numeric(18,2))

insert @customers (id, name)
values 
(1, 'Первый'), 
(2, 'Второй'), 
(3, 'Третий'),
(4, 'Четвертый')

insert @orders (id, summa, customerId)
values 
(1, 10, 1), 
(2, 15, 1), 
(3, 20, 1), 
(4, 25, 1), 
(5, 12, 2), 
(6, 14, 2), 
(7, 200, 2), 
(8, 100, 3), 
(9, 200, 3)
insert @payments (customerId, payment)
values 
(1, 30), 
(2, 500), 
(3, 100), 
(4, 20)

select c.id as customer_id, c.name as customer_name
     , o.id as order_id, o.summa
     , max(o.slide_order_summ) over(partition by o.customerId) as total_order_summ
     , p.payment
     , p.payment - max(o.slide_order_summ) over(partition by o.customerId) as x_balance
  from @customers c
  join (
         select o0.*, v.slide_order_summ
           from @orders o0
          cross apply 
                (
                  select sum(summa) as slide_order_summ
                    from @orders o1
                  where o0.customerId = o1.customerId
                    and o0.id>= o1.id
                ) v
       )o
      on c.id = o.customerId
  join @payments p
    on c.id = p.customerId
 where o.slide_order_summ <= p.payment


З.Ы.
На версиях от 2012 и выше можно заменить cross apply на SUM() OVER(order by)
9 дек 15, 05:40    [18533044]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
З.Ы.
На версиях от 2012 и выше можно заменить cross apply на SUM() OVER(order by)

select c.id as customer_id, c.name as customer_name
     , o.id as order_id, o.summa
     , max(o.slide_order_summ) over(partition by o.customerId) as total_order_summ
     , p.payment
     , p.payment - max(o.slide_order_summ) over(partition by o.customerId) as x_balance
  from @customers c
  join (
         select o0.*
              , sum(summa) over(partition by customerId order by id) as slide_order_summ
           from @orders o0
       )o
      on c.id = o.customerId
  join @payments p
    on c.id = p.customerId
 where o.slide_order_summ <= p.payment
9 дек 15, 06:01    [18533053]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
NatalieZholob
Member

Откуда:
Сообщений: 7
Добрый Э - Эх,

Спасибо Большое все работает))) сервер 2008.

Может это немного не по теме, но можете подсказать хорошую литература по SQL )))) буду учить матчасть)))
9 дек 15, 09:02    [18533324]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
Добрый Э - Эх
Guest
NatalieZholob,

лучше родной документации ещё не встречал книги... ;)
9 дек 15, 09:06    [18533337]     Ответить | Цитировать Сообщить модератору
 Re: Найти все полностью оплаченные заказы  [new]
NatalieZholob
Member

Откуда:
Сообщений: 7
Добрый Э - Эх,

понятно, буду разбираться))) спасибо еще раз!
9 дек 15, 09:12    [18533370]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить