2015-02-10 67 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