2015-02-10 73 views
0

值我有2个表,tblBasicInfotblPayment减去父表SUM(从子表值)

关系为1对多,其中tblBasicInfo位于1侧,而tblPayment位于many侧。

关系是可选的,这就是问题所在。

我需要从父表中减去某些字段的值与子表匹配某些标准的某些字段的总和。

如果子表中没有满足条件的记录,则应该用零表示(data from parent table - 0)。

我很抱歉,如果这不清楚,英语不是我的母语,我没有足够的经验来知道如何正确描述问题。

这将是最好的证明我的意思用一个小例子:

我们应从表模式开始:

tblBasicInfo: #ID, TotalPrice (double) 

tblPayment: #P_ID, $ID, Amount (double), IsPaid (bool) 

这里是父表tblBasicInfo内容:

ID | TotalPrice 

1 | 100 

2 | 150 

3 | 200 

4 | 250 

这里是子表tblPayment内容:

P_ID | ID | IsPaid | Amount 

    1 | 1 | true | 50 

    2 | 1 | false | 25 

    3 | 2 | false | 100 

    4 | 2 | false | 25 

    5 | 3 | true | 200 

这是我对我自己来完成:

SELECT tblBasicInfo.ID, 
    (tblBasicInfo.TotalPrice - sum(tblPayment.Amount)) AS [Difference] 
    FROM tblBasicInfo, tblPayment 
    WHERE (tblBasicInfo.ID = tblPayment.ID) 
    GROUP BY tblBasicInfo.TotalPrice, tblPayment.IsPaid 
    HAVING (tblPayment.IsPaid = TRUE) --this is the criteria I talked above 
    ORDER BY tblBasicInfo.ID; 

这是我从上面的查询得到:

ID | Difference 

1 | 50 
3 | 0 
. 
. 
. 

我需要得到以下结果:

ID | Difference 

1 | 50 
2 | 150  -- does not meet the criteria (IsPayed = false) 
3 | 0 
4 | 250  -- no records in child table 
. 
. 
. 

我对这个问题的不完善标题道歉,但我REA lly不知道如何描述这个问题。

回答

1

我想这个SQL Server上的计算是空的,但可以实现相同的其它关系数据库管理系统,你可以做到这一点这里可能不止一种方式我提出了两种解决方案,我发现第一个解决方案的性能比第二

SELECT ti.id,MAX(totalprice) - ISNULL(SUM(CASE WHEN is_payed = ((0)) THEN 0 ELSE amount END),0) amount 
FROM tblbasicinfo ti LEFT OUTER JOIN tblpayment tp ON ti.id = tp.p_id 
GROUP BY ti.id 

--OR 

SELECT id,totalprice-ISNULL((SELECT SUM(amount) 
FROM tblpayment tp 
WHERE ti.id = tp.p_id AND is_payed = ((1)) 
GROUP BY id),0) AS reconsile 
FROM tblbasicinfo ti 

enter image description here

CREATE TABLE tblBasicInfo (id INT IDENTITY(1,1),totalprice MONEY) 

CREATE TABLE tblPayment (id INT IDENTITY(1,1), P_ID INT ,is_payed BIT,amount MONEY) 

INSERT INTO tblbasicinfo 

VALUES(100),(150),(200),(250) 

INSERT INTO tblpayment(p_id,is_payed,amount) 
VALUES(1,((1)),50),(1,((0)),25),(2,((0)),100),(2,((0)),25),(3,((1)),200) 
更好
+0

我已经选择了第二个选项。对未来的读者来说,**和重要的一点是:**'ISNULL'函数在SQL Server和MS Access中不一样,在MS Access中使用'NZ'代替! Upvoted并正式接受。谢谢。最好的问候,直到下一次! – AlwaysLearningNewStuff 2015-02-10 06:01:54

0

(小修正 - IsPaid而不是IsPayed)
这没有测试或任何它只是希望你指向正确的方向。
您想使用左连接,然后检查是否量在你difference

SELECT 
    bi.ID, 
    (bi.TotalPrice - sum(IIF(p.Amount is null,0,p.Amount))) AS [Difference] 
    FROM tblBasicInfo bi, 
     left join tblPayment p 
      on p.id = bi.id 
      and p.IsPaid = 1 
    GROUP BY bi.ID, bi.TotalPrice 
    ORDER BY bi.ID; 
1

试试这个

select a.Id,(a.TotalPrice-payment.paid) as Difference from tblBasicInfo a 
    left join 
    (

    select sum(Amount) as paid,Id 
    from 
    tblPayment 
    group by Id 
     where IsPaid =1)payment 
    on a.Id=payment.Id 
+0

好吧,我已经试过了,它的工作原理。我只是要求你帮我解决以下问题:对于子表中没有记录的情况,“差异”是“NULL”。我需要它是'TotalPrice'。我已经设法通过将'(a.TotalPrice-payment.paid)'变成NZ(a.TotalPrice-payment.paid,a.TotalPrice)来做到这一点,但我很想知道是否有更好的方法。谢谢。最好的祝福。 – AlwaysLearningNewStuff 2015-02-10 05:45:43

+0

您可以试试这个:,(a.TotalPrice-isnull(payment.paid,0))作为差异差异。 – 2015-02-10 05:55:58

+0

我已经upvoted你的答案。我接受另一个理由的原因是,我理解它更容易。感谢您的帮助。最好的问候,直到下一次。 – AlwaysLearningNewStuff 2015-02-10 06:03:55