Как я могу вычесть из промежуточного подзапроса в моем запросе? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать случай, когда при наличии предыдущего платежа я могу вычесть его из выбранного диапазона дат суммы.

Я создал все, что мне нужно, кроме сумм предыдущих платежей.Я продолжаю сталкиваться с ошибками подзапроса

SELECT 
   acctnmbr
  ,amount*commission/100
  ,(select amount*commission/100 from transactions where trantype=0001 and tran_dt < @startdate) as Previous_Payments
FROM transactions
  where trantype=0001 and tran_dt between @startdate and @enddate

, где Previous_Payments я сталкиваюсь с ошибками подзапроса, потому что использую <</p>

. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 27 декабря 2018

Причина, по которой вы получаете ошибки в своем подзапросе, заключается в том, что он находится в проекции, поэтому он должен возвращать одно значение.Ваш подзапрос, как он есть, вернет несколько значений.Он также будет возвращать ВСЕ предыдущие транзакции без каких-либо ограничений, кроме trantype и tran_dt, что, вероятно, не то, что вы действительно хотите.

Я также предполагаю, что вы хотите получить совокупную сумму всего, так как кажется, что это имеет смыслна основании небольшого описания, которое вы предоставили.Однако я буду рад обновить мой ответ, если вы предоставите некоторую дополнительную информацию, как предлагает Гордон Линофф.

Вы можете атаковать это несколькими различными способами ...

Общее выражение таблицы (CTE):

WITH PriorPayments AS
SELECT acctnmbr, amount*commission/100 as payment from transactions where trantype=0001 and tran_dt < @startdate

SELECT trx.acctnmbr, 
       sum(trx.amount*trx.commission/100) as total_payment, 
       sum(ISNULL(pp.payment,0)) as prior_payment 
FROM transactions trx 
LEFT JOIN PriorPayments pp ON trx.acctnmbr=pp.acctnmbr
WHERE trx.trantype=0001 
AND trx.tran_dt BETWEEN @startdate and @enddate
GROUP BY trx.acctnmbr

Подзапрос:

SELECT trx.acctnmbr, 
       sum(trx.amount*trx.commission/100) as total_payment, 
       sum(ISNULL(pp.payment,0)) as prior_payment 
FROM transactions trx 
LEFT JOIN (
    SELECT acctnmbr, amount*commission/100 as payment from transactions where trantype=0001 and tran_dt < @startdate
) AS pp ON trx.acctnmbr=pp.acctnmbr
WHERE trx.trantype=0001 
AND trx.tran_dt BETWEEN @startdate and @enddate
GROUP BY trx.acctnmbr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...