SQL - запрос запроса - PullRequest
       1

SQL - запрос запроса

0 голосов
/ 18 ноября 2011

В основном у меня есть две таблицы, озаглавленные Purchase и PurchaseRefund.

. Вы можете иметь одну Purchase, но несколько PurchaseRefund строк на основе PurchaseId.

ЧтоЯ пытаюсь сделать, это написать запрос, принимая параметры @purchase_id и @refund_id

Допустим, у нас есть строка покупки, которая имеет TotalAmount £ 10 и SubTotal £ 10

Тогда у нас есть две PurchaseRefund строки ....

216 - Has a refundAmount of £2.50   
217 - Has a refundAmount of £2.25  

Поэтому, когда запрос выполняется с @refund_id как 216 , он должен показать

SubTotal: £10  
Refund: £2.5  
Total: £7.50  

И когда запрос выполняется с @refund_id как 217 , он должен показывать

SubTotal: £7.50  
Refund: £2.25  
Total: £5.25   

Надеюсь, это имеет смысл

Ответы [ 5 ]

1 голос
/ 18 ноября 2011

Вам нужно объединиться из Purchase в PurchaseRefund и получить все строки, которые "соответствуют" вашим критериям - что-то вроде:

DECLARE @Purchase TABLE (PurchaseID INT, TotalAmount DECIMAL(10,2))

INSERT INTO @Purchase VALUES(42, 10.0)

DECLARE @PurchaseRefund TABLE (RefundID INT, PurchaseID INT, RefundAmount DECIMAL(10,2))

INSERT INTO @PurchaseRefund VALUES (216, 42, 2.50)
INSERT INTO @PurchaseRefund VALUES (217, 42, 2.25)

DECLARE @MaxRefundID INT = 217

SELECT 
   p.PurchaseID,
   SUM(r.RefundAmount) AS 'Refund', 
   MAX(p.TotalAmount) - SUM(r.RefundAmount)  AS 'Total'
FROM @Purchase p
INNER JOIN @PurchaseRefund r ON p.PurchaseID = r.PurchaseID
WHERE r.RefundId <= @MaxRefundID
GROUP BY p.PurchaseID

Это работает в основном нормально - для значения @MaxRefundID = 216Я получаю:

PurchaseID  Refund  Total
   42        2.50   7.50

и для значения @MaxRefundID = 217 я получаю:

PurchaseID  Refund  Total
  42         4.75   5.25   
0 голосов
/ 18 ноября 2011

Удалось отработать это, наверное, не самое лучшее, но это работает ....

DECLARE     @subtotal                                       DECIMAL(18,2)


SELECT      @subtotal                                       = COALESCE  (SUM(PurchaseRefund.RefundAmount), 0) 
                                                            FROM        PurchaseRefund 
                                                            WHERE       PurchaseId      = @PurchaseId 
                                                            AND         id              < @PurchaseRefundId


SELECT          pure.Id, 
                pure.ConsumerId, 
                pure.ConsumerCode, 
                pure.RetailerStoreId,
                pure.RefundAmount, 
                pure.TimestampReceived, 
                pure.TimestampPayPalRequest, 
                pure.TimestampPayPalResponse, 
                pure.TimestampResponed          AS TimestampResponded, 
                pure.RefundKey, 
                pure.ResponseCode, 
                pure.RetailerId,
                reco.Headline                   AS OfferUsed,
                retr.Name                       AS RetailerName,
                rest.Name                       AS RetailerStoreName,
                purc.CurrencyCode,
                reco.DiscountType,
                reco.DiscountValue,
                purc.PayKey,
                purc.TransactionId,
                2                                           AS transactionType,
                purc.isInStore,
                purc.Total - @subtotal                      AS SubTotal, 
                purc.Total - @subtotal - pure.RefundAmount  AS Total, 
                purc.TrackingId, 
                purc.ResponseCode, 
                pure.TerminalId,
                pure.Id                     AS PurchaseRefundId,
                purc.Id                     AS PurchaseId       

FROM            PurchaseRefund              pure

INNER JOIN      Purchase                    purc
ON              pure.PurchaseId             = purc.Id

INNER JOIN      Retailer                    retr
ON              purc.RetailerId             = retr.Id

LEFT OUTER JOIN RetailerCoupon              reco
ON              purc.RetailerCouponId       = reco.Id

LEFT OUTER JOIN RetailerStore               rest
ON              purc.RetailerStoreId        = rest.id

WHERE           purc.Id                     = @PurchaseId
AND             pure.Id                     = @PurchaseRefundId
0 голосов
/ 18 ноября 2011

Это основано на решении marc_s, чтобы получить точные числа, которые вы ищете.

DECLARE @Purchase TABLE (PurchaseID INT, TotalAmount DECIMAL(10,2))

INSERT INTO @Purchase VALUES(42, 10.0)

DECLARE @PurchaseRefund TABLE (RefundID INT, PurchaseID INT, RefundAmount DECIMAL(10,2))

INSERT INTO @PurchaseRefund VALUES (216, 42, 2.50)
INSERT INTO @PurchaseRefund VALUES (217, 42, 2.25)

DECLARE @RefundID int = 217

SELECT 
   p.TotalAmount - (SELECT SUM(RefundAmount) FROM @PurchaseRefund WHERE RefundID < r.RefundID) as SubTotal,
   r.RefundAmount AS 'Refund', 
   p.TotalAmount - (SELECT SUM(RefundAmount) FROM @PurchaseRefund WHERE RefundID <= r.RefundID) as Total
FROM @Purchase p
INNER JOIN @PurchaseRefund r ON p.PurchaseID = r.PurchaseID
where r.RefundID = @RefundID
GROUP BY r.RefundID, p.TotalAmount, r.RefundAmount
0 голосов
/ 18 ноября 2011

Если бы это было для отображения / отчета, я бы сделал промежуточные итоги, выполняя это с помощью sql - это огромная PIA.

SELECT 
p.Amount,
r.Refund,  
Sum(rPrevious.Refunds) As RunningTotal,
FROM Purchases p
Inner Join Refunds r On r.PurchaseId = p.PurchaseID And r.RefundID = @RefundID
Inner Join Refunds rPrevious on r.PurchaseID = p.PurchaseID AND rPrevious.RefundID < @RefundID
WHERE p.PurchaseID = @PurchaseID
Group By p.Amount,r.Refund

Даст вам 216 10,2.50,0и 10,2.25,2,5 для 217, так что

Select (Amount - RunningTotal) as Subtotal,
Refund, 
(Amount - Refund - RunningTotal) as Total
From
( SELECT 
  p.Amount,
  r.Refund  
  Sum(rPrevious.Refunds) As RunningTotal,
  FROM Purchases p
  Inner Join Refunds r On r.PurchaseId = p.PurchaseID And r.RefundID = @RefundID
  Inner Join Refunds rPrevious on rPrevious on r.PurchaseID = p.PurchaseID 
                                  AND rPrevious.RefundID < @RefundID
  WHERE p.PurchaseID = @PurchaseID
  Group By p.Amount,r.Refund
) RunningTotals

Должен сделать работу, хотя не проверено, и я мог бы получить лицензию с именами ваших столбцов.

Теория звукахотя нужной вам строкой является Сумма покупки - Сумма возмещения <@RefundID Сумма возмещения для суммы возврата и вашей общей суммы только одна - другая.Или приобрести Сумма - Сумма возмещения <strong><= </strong> @ RefundID

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

Добавлены пропущенные скобки ...

0 голосов
/ 18 ноября 2011
SELECT purchase.id, purchase.amount, sum(purchaseRefund.amount), (purchase.amount - sum(purchaseRefund.amount)) as total
FROM Purchase as purchase
LEFT JOIN PurchaseRefund as purchaseRefund on purchaseRefund.purchaseId = purchase.id
WHERE purchase.id = 216
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...