2011-11-17 75 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