Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти все полностью оплаченные заказы / 12 сообщений из 12, страница 1 из 1
08.12.2015, 16:54
    #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
08.12.2015, 17:04
    #39123462
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все полностью оплаченные заказы
NatalieZholob,

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



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

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

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

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

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

версия сервера какая?
...
Рейтинг: 0 / 0
09.12.2015, 05:40
    #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
09.12.2015, 06:01
    #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
09.12.2015, 09:02
    #39123772
NatalieZholob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти все полностью оплаченные заказы
Добрый Э - Эх,

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

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

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

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


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