powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти все полностью оплаченные заказы
12 сообщений из 12, страница 1 из 1
Найти все полностью оплаченные заказы
    #39123446
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)
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123462
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NatalieZholob,

Код: sql
1.
2.
GROUP BY customerId
HAVING SUM(payments) >= SUM(summa)



А вот что выше уж додуматесь сами.
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123582
NatalieZholob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin,

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

Если есть возможность подскажите что надо сделать)))
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123590
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NatalieZholobЕсли есть возможность подскажите что надо сделать))) http://www.sql.ru/forum/1018035/zadachka-pro-yabloki-ili-sliyanie-2h-tablic
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123647
NatalieZholob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

спасибо сейчас попробую
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123720
NatalieZholob,

что должно получится на выходе ? покажи на примере своих же тестовых данных.
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123722
NatalieZholob,

версия сервера какая?
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123725
NatalieZholob, лишнее поля в итоговом выводе уберешь, если что...

Код: 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.
44.
45.
46.
47.
48.
49.
50.
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)
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123729
Добрый Э - ЭхЗ.Ы.
На версиях от 2012 и выше можно заменить cross apply на SUM() OVER(order by)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123772
NatalieZholob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

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

Может это немного не по теме, но можете подсказать хорошую литература по SQL )))) буду учить матчасть)))
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123778
NatalieZholob,

лучше родной документации ещё не встречал книги... ;)
...
Рейтинг: 0 / 0
Найти все полностью оплаченные заказы
    #39123784
NatalieZholob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

понятно, буду разбираться))) спасибо еще раз!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти все полностью оплаченные заказы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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