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

Откуда:
Сообщений: 42
Ест таблица заказов Orders с полями:

CustomerID,
OrderPrice,
Status
OrderDate

если Status = 1 - это значит оплачено, если 2 - значит это кредит.
Как вывести в одном запросе такие данные:

Клиент / Сумма долга клиента / Общая сумма (оплаченные + неоплаченные) по заказам клиента

Спасибо заранее!
25 июн 12, 13:17    [12770015]     Ответить | Цитировать Сообщить модератору
 Re: запрос подсчета дебета и кредита  [new]
RubinDm
Member

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

select CustomerID = C.[ID], CustomerName = C.[Name],
O.[Общая сумма], O.[Оплачено], O.[НеОплачено]
from Customers C
outer apply
( select
  , [Общая сумма] = sum(O.OrderPrice)
  , [Оплачено] = sum(case O.Status = 1 then O.OrderPrice else 0 end)
  , [НеОплачено] = sum(case O.Status = 2 then O.OrderPrice else 0 end)
  from Orders O
  where O.CustomerID = C.ID
) O
25 июн 12, 13:25    [12770083]     Ответить | Цитировать Сообщить модератору
 Re: запрос подсчета дебета и кредита  [new]
topcyprus
Member

Откуда:
Сообщений: 42
RubinDm
topcyprus,

select CustomerID = C.[ID], CustomerName = C.[Name],
O.[Общая сумма], O.[Оплачено], O.[НеОплачено]
from Customers C
outer apply
( select
  , [Общая сумма] = sum(O.OrderPrice)
  , [Оплачено] = sum(case O.Status = 1 then O.OrderPrice else 0 end)
  , [НеОплачено] = sum(case O.Status = 2 then O.OrderPrice else 0 end)
  from Orders O
  where O.CustomerID = C.ID
) O


RubinDm, Спасибо за ответ и желание помочь!

В моем синтаксисе это выглядит так (если ничего не напутал)

select CustomerID = C.CustomerID, CustomerName = C.CustomerName,
O.[Общая сумма], O.[Оплачено], O.[НеОплачено]
from b_Customer C
outer apply
( select
    [Общая сумма] = sum(O.TotalPrice)
  , [Оплачено] = sum(case O.OrderStatusPaymentTypeID = 1 then O.TotalPrice else 0 end)
  , [НеОплачено] = sum(case O.OrderStatusPaymentTypeID = 2 then O.TotalPrice else 0 end)
  from b_Order O
  where O.CustomerID = C.CustomerID
) O


но выдается ошибка
Msg 102, Level 15, State 1, Line 7
Incorrect syntax near '='.

Ошибками выделяются знаки "=", которые O.OrderStatusPaymentTypeID = 1 и O.OrderStatusPaymentTypeID = 2
Можете ли подправить мой запрос, пожалуйста?
25 июн 12, 13:34    [12770158]     Ответить | Цитировать Сообщить модератору
 Re: запрос подсчета дебета и кредита  [new]
antbr
Member

Откуда:
Сообщений: 75
topcyprus,
после case нужно поставить when.
А вообще прочтите в bol как правильно писать выражение case...end.
25 июн 12, 13:45    [12770255]     Ответить | Цитировать Сообщить модератору
 Re: запрос подсчета дебета и кредита  [new]
topcyprus
Member

Откуда:
Сообщений: 42
antbr
topcyprus,
после case нужно поставить when.
А вообще прочтите в bol как правильно писать выражение case...end.


Спасибо, заработало!

Ну надо же, outer apply - это какая-то высшая магия для меня, век живи - век учись :)

Всем спасибо!
25 июн 12, 13:53    [12770348]     Ответить | Цитировать Сообщить модератору
 Re: запрос подсчета дебета и кредита  [new]
lgdmitry
Member

Откуда: Energodar
Сообщений: 48
Странно что не потребовал group by. Можно тоже самое через left join. Интересно что быстрее работает, например у меня одинаковое время выполнения на сервере.

select c.IDCLIENT, o.summary
from S_CLIENT c
outer apply
( select 
	summary = sum(VALUE)
	,IDCLIENT
from T_ORDER o
where o.IDCLIENT = c.IDCLIENT
group by IDCLIENT
) o

select c.IDCLIENT, o.summary
from S_CLIENT c
left join ( select 
	summary = sum(VALUE)
	,IDCLIENT
from T_ORDER o
group by IDCLIENT
) o
	on o.IDCLIENT = c.IDCLIENT
25 июн 12, 14:38    [12770853]     Ответить | Цитировать Сообщить модератору
 Re: запрос подсчета дебета и кредита  [new]
PVC
Member

Откуда:
Сообщений: 319
topcyprus, можно так

select 
  C.[ID],
  C.[Name],
  sum(O.OrderPrice) [Общая сумма], 
  sum(O.OrderPrice * (2 - O.Status)) [Оплачено], 
  sum(O.OrderPrice * (O.Status - 1)) [НеОплачено] 
from Customers C
join Orders O on O.CustomerID = C.ID
group by C.[ID], C.[Name]
25 июн 12, 15:40    [12771447]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить