2011-11-17 74 views
0

基本上我有兩個表,標題分別爲PurchasePurchaseRefundSQL - 查詢請求

根據PurchaseId,您可以有一個Purchase但多個PurchaseRefund行。

我所試圖做的是編寫一個查詢到的參數@purchase_id@refund_id

比方說,我們有有£10 TotalAmount和£10

SubTotal然後我們有一個購買行2個PurchaseRefund行....

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

因此,當查詢與@refund_id運行作爲它應該顯示

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

而當查詢與@refund_id運行作爲它應該顯示

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

我希望是有道理的

+1

你要尋找的運行總量。你可以使用自連接和其他方法來做到這一點。必須和你們一起尋找。 –

+0

Raj - 這是否有幫助pastebin.com/t3mhHKQt – swade1987

+0

我可以假設refund_ID與時間呈線性關係嗎?您只希望顯示那些等於或小於正在查找的refund_id的總數? – xQbert

回答

-1
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 
+0

Thorsten - 歡呼的幫助非常感謝。但是,返回錯誤消息 消息8120,級別16,狀態1,行1 列'Purchase.Id'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – swade1987

1

你需要從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 

這個作品大多OK - 爲@MaxRefundID = 216值,我得到:

PurchaseID Refund Total 
    42  2.50 7.50 

,併爲@MaxRefundID = 217值,我得到:

PurchaseID Refund Total 
    42   4.75 5.25 
+0

雖然217退款應該顯示2.25 – swade1987

+0

@ user1052764:是的,我知道你已經要求了 - 無法包裝我的頭如何實現這一點:-(我的解決方案將*總結*所有的退款直至幷包括你給那個ID .... –

0

如果這是一個顯示/報告,我會做的總計在那,用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 退款的refundid 量的總和與總只是一個 - 對方。或購買金額 - 退款金額< = @RefundID

內部查詢技巧只是節省了大量關於退款總和的解析嗎?兩次,一次爲小計,一次爲總計。

添加缺少括號...

+0

託尼嗨, 我的查詢是這樣的 - http://pastebin.com/P0HTf3XT 但我得到以下錯誤: 消息156 ,Level 15,State 1,Line 7 關鍵字'as'附近語法不正確 Msg 102,Level 15,State 1,Line 24 'RunningTotals'附近的語法不正確 – swade1987

+0

嗯,我沒有編輯權限;看起來你需要在第一行中的一個緊密的圓括號nd代碼塊。 – Bert

+0

@Bert well spotted –

0

這建立在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

雖然對RefundId-217而言,這是正確的,但SubTotal錯誤,因爲它顯示10而不是7.50 – swade1987

+0

我明白你的意思了;上面的修正。 – Bert

0

管理去解決問題的可能不是最好的,但它的工作原理....

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