2015-03-02 66 views
0

我有3個表如何從3個表中獲取數據?

collecton, paymentdata, payment 

Payment表計算表,它只有一個產品數據

所以,rcvamtrestamt從支付表得到

我有以下數據

收藏:

id(PK) clientid company  Client product  total note 
1  2001  Company1 Client1 Product1 50000 note1 
2  2002  Company2 Client2 Product2 60000 note2 
3  2003  Company3 Client3 Product3 70000 note3 

PaymentData:

wid(PK)wcid(FK) clientid product rcvamt restamt rcvdate  nxtdate Note 
    1  1  2001 Product1 500  49500 10-1-2015 11-2-2015 abc1 
    2  1  2001 Product1 800  48700 11-2-2015 12-3-2015 xyz1 
    3  2  2002 Product2 1500 58500 5-3-2015 6-4-2015 qwe1 

付款

id(PK) wid(FK) clientid product  rcvamt restamt 
1  2  2001  Product1 1300 48700 
2  3  2002  Product2 1500 58500 

我想告訴喜歡

clientid company procudt total rcvamt restamt rcvdate  nxtdate note 
2001  Company1 Product1 50000 1300 48700 11-2-2015 12-3-2015 xyz1 
2002  Company2 Product2 60000 1500 58500 5-3-2015 6-4-2015 qwe1 
2003  Company3 Product3 70000 -  -  -   -  - 
+7

你有什麼試圖達到你想要的結果? – 2015-03-02 11:52:05

+1

另外:***這是哪個具體數據庫? – 2015-03-02 12:13:14

+0

我只想得到1個客戶+產品結果,所以每個客戶,產品可以是不同的,每個交易日期和記錄可以不同,所以我得到一個記錄2,3次我提到我的要求有問題。 – Dotnet 2015-03-02 12:40:38

回答

0

像這樣的東西應該工作的報告。看起來你想要在restamt上進行彙總,其他兩個字段都是收到的最後一筆付款。由於你的名字,我也認爲這是SQL Server。如果它是不同的分貝,請提供

更新:更改爲左加入來處理客戶端3沒有產品,固定錯誤的產品。 SQL小提琴:http://sqlfiddle.com/#!3/8ad566/19/0

SELECT 
    c.clientid, 
    c.company, 
    c.product, 
    c.total, 
    SUM(pd.rcvamt) AS rcvamt, 
    LastPayment.restamt, 
    LastPayment.rcvdate, 
    LastPayment.nxtDate, 
    LastPayment.note 
FROM Collection c 
    LEFT OUTER JOIN PaymentData pd 
     ON pd.wcid = c.id 
    LEFT OUTER JOIN (
     SELECT 
      wcid, 
      restamt, 
      rcvdate, 
      nxtdate, 
      Note, 
      ROW_NUMBER() OVER (PARTITION BY wcid ORDER BY rcvdate DESC) AS RowNum 
     FROM PaymentData 
    ) LastPayment 
     ON LastPayment.wcid = c.id 
      AND LastPayment.RowNum = 1 -- Get last payment info 
GROUP BY 
    c.clientid, 
    c.company, 
    c.product, 
    c.total, 
    LastPayment.restamt, 
    LastPayment.rcvdate, 
    LastPayment.nxtDate, 
    LastPayment.note 
ORDER BY 
    c.clientid 
+0

thanx Jason W,但它不給我輸出任何東西。我得到了上述解決方案的工作。 – Dotnet 2015-03-03 05:02:49

+0

我做了一些修改來修復查詢 - 在其中一個字段中輸入了錯字,並且由於客戶端3還沒有付款,所以加入應該已經離開了。希望它能爲你工作。我添加了SQL小提琴顯示正確性:http://sqlfiddle.com/#!3/8ad566/19/0 – 2015-03-03 05:45:44

+0

此外,雖然從PdrSntsFrrr的答案是準確的,但我會小心如果你有很多記錄。適當的索引可以使它適用於較小的結果集,但意識到您正在運行3個相關的子查詢,從而導致每個查詢在結果集的每一行中重複。 – 2015-03-03 05:49:54

0

的回答你的問題看起來是這樣的

Select Collection.clientid 
     ,Collection.company 
     ,Collection.product 
     ,Collection.total 
     ,Payment.rcvamt 
     ,Payment.restamt 
     ,PaymentData.rcvdate 
     ,PaymentData.nxtdate 
     ,PaymentData.Note 

From PaymentData 
Inner Join (Select wcid 
         ,Max(PaymentData.rcvdate) as rcvdate 
         ,Max(PaymentData.nxtdate) as nxtdate 
        FROM PaymentData 

        GROUP BY wcid) AS SubSelect ON PaymentData.wcid = SubSelect.wcid 
              AND PaymentData.rcvdate = SubSelect.rcvdate 
              AND PaymentData.nxtdate = SubSelect.nxtdate 

Inner Join Payment on PaymentData.wcid = Payment.id 
RIGHT OUTER JOIN Collection ON PaymentData.clientid = Collection.clientid 

這裏sqlfiddle來證明我的答案。

+0

thanx WiiMaxx,但它不給我rcvamt,rcvdate,restamt,nxtdate,該字段爲空,我得到了上面的PdrSntsFrrr解決方案的工作。 – Dotnet 2015-03-03 05:04:52

+0

@Dotnet他和我的答案的結果與我所看到的票價相同,但是如何確保將您用作答案的答案標記爲「答案」 – WiiMaxx 2015-03-03 07:29:58

1

我試圖使它簡單:

SELECT DISTINCT 
    C.clientid 
, C.company 
, C.product 
, C.total 
, P.rcvamt 
, P.restamt 
, (SELECT TOP 1 rcvdate FROM PaymentData AS PD1 WHERE PD1.ClientID=PD.ClientID AND PD1.Product=PD.Product ORDER BY rcvdate DESC) 
, (SELECT TOP 1 nxtdate FROM PaymentData AS PD1 WHERE PD1.ClientID=PD.ClientID AND PD1.Product=PD.Product ORDER BY rcvdate DESC) 
, (SELECT TOP 1 Note FROM PaymentData AS PD1 WHERE PD1.ClientID=PD.ClientID AND PD1.Product=PD.Product ORDER BY rcvdate DESC) 
FROM 
    Collection C 
     LEFT OUTER JOIN Payment P 
      ON C.clientid = P.clientid 
     LEFT OUTER JOIN PaymentData PD 
      ON P.clientid = PD.clientid 

但我不知道所有的表之間的關係。