2012-01-27 52 views
0

我有(再次)此表:多個表(一個是子查詢)加入

User: 
id | name 
------------- 
1 | 'John' 
2 | 'Peter' 
3 | 'Luke' 

Accounts: 
id | userid | amount | date 
-------------------------- 
1 | 1  | 1000 | '2012-01-26' 
2 | 1  | 2000 | '2011-12-25' 
3 | 1  | 1000 | '2012-01-25' 
4 | 2  | 1500 | '2012-01-15' 
5 | 3  | 2500 | '2011-11-30' 

我需要收集數據,所以我有,在同一時間,與用戶一個結果,計數每個用戶的帳戶金額總和,以及每個用戶的帳戶數量,但只有當前年份的日期...

這樣的事情:

Some-query: 
UserName | CountAccts | SumAccts | CountAcctsThisYear 
----------------------------------------------------- 
'John' | 3   | 4000  | 2 
'Peter' | 1   | 1500  | 1 
'Luke' | 1   | 2500  | 0 

I管理與此查詢,以獲得前3列:

SELECT u.name as Username, 
     COUNT(a.id) as CountAccts, 
     SUM(a.amount) as SumAccts 
FROM User u 
LEFT JOIN Accounts a ON u.id = a.userid 
GROUP BY u.id; 

另外,我可以拿到第一和最後一列與此另一個:

SELECT u.name as Username, 
     COUNT(acctsthisyear.id) as CountAcctsThisYear 
FROM User u 
LEFT JOIN (SELECT a.id 
      FROM Accounts a 
      WHERE DATE_FORMAT(a.date,'%Y') = DATE_FORMAT(CURDATE(),'%Y') 
     ) AS acctsthisyear ON u.id = acctsthisyear.userid 
GROUP BY u.id; 

但是,這裏的問題,我不能設法使用這兩個查詢以這種方式得到我期待的最終結果...

我有... - 試圖左用用戶表加入帳戶表和acctsthisyear子查詢(分組由us.id字段),但我得到的是這樣的:

UserName | CountAccts | SumAccts | CountAcctsThisYear 
----------------------------------------------------- 
'John' | 6   | 6000  | 6 
'Peter' | 1   | 1500  | 1 
'Luke' | 0   | 0  | 0 

(不記得所有的細節,但問題是,例如,2個結果「約翰」在CountAcctsThisyear,得到的結果過分重複,所有乘上... )

  • 試圖每個查詢作爲子查詢: SELECT * FROM (與u.id第一查詢作爲UFID還選擇)AS第一, (與u.id第二查詢作爲USID還選擇)AS第二 GROUP BY ufid,usid

,得到了這樣的事情:

UserName | CountAccts | SumAccts | CountAcctsThisYear 
----------------------------------------------------- 
'John' | 3   | 4000  | 2 
'Peter' | 1   | 1500  | 2 
'Luke' | 1   | 2500  | 2 
'John' | 3   | 4000  | 1 
'Peter' | 1   | 1500  | 1 
'Luke' | 1   | 2500  | 1 
'John' | 3   | 4000  | 0 
'Peter' | 1   | 1500  | 0 
'Luke' | 1   | 2500  | 0 

(如果我通過元素反轉集團,我得到的是相同的,但在不同的順序分組...)

任何方式...就是這樣......關於什麼是正確的方式來實現我所期待的任何想法?我與它很沮喪,因爲我真的在SQL方面的專家,特別是在連接: -/

回答

2

試試這個:

SELECT u.`Name` as UserName, 
     Count(*) as CountAccts, 
     SUM(a.`amount`) as SumAccts, 
     COALESCE(iTable.CountAcctsThisYear, 0) as CountAcctsThisYear 
FROM `User` u INNER JOIN `Accounts` a 
        ON u.`ID` = a`.`ID` 
       LEFT JOIN 
        (SELECT `ID`, Count(*) as CountAcctsThisYear 
        FROM `Accounts` 
        WHERE DATE_FORMAT(`date`,'%Y') = DATE_FORMAT(CURDATE(),'%Y') 
        GROUP BY `ID`) as iTable 
       ON `User`.`ID` = iTable.`ID` 
GROUP BY `User`.`Name` 
+0

謝謝!我仍然在測試,因爲我的真實數據有更多的條件,但最基本的部分是我發佈的東西......現在,這似乎是正確的答案,我會盡快告訴你,一旦我完成測試! – 2012-01-27 05:44:10

+0

就這樣了,再次感謝! – 2012-01-27 06:19:15

0
SELECT u.name as Username, 
     COUNT(a.id) as CountAccts, 
     SUM(a.amount) as SumAccts 
FROM User u 
INNER JOIN Accounts a ON u.id = a.userid 
GROUP BY u.id,YEAR(a.date) 

一次嘗試這個!

1
SELECT u.name as Username, 
     COUNT(a.id) as CountAccts, 
     SUM(a.amount) as SumAccts, 
     SUM(CASE WHEN YEAR(a.date) = YEAR(CURDATE()) THEN 1 ELSE 0 END) 
      as CountAcctsThisYear 
FROM User u 
LEFT JOIN Accounts a ON u.id = a.userid 
GROUP BY u.id; 
+0

:Group By應該由a.userid – 2012-01-27 05:44:36

+0

如何通過u.id在u.id不會倍數的表中進行分組。它是獨一無二的。我認爲小組應該由a.userid。你測試過了嗎? – 2012-01-27 05:54:36

+0

a.userid與u相同。我們加入這個條件。 – piotrm 2012-01-27 06:20:35

1
SELECT u.name as Username, 
     COUNT(a.userid) as CountAccts, 
     SUM(a.amount) as SumAccts, 
     SUM(CASE WHEN YEAR(a.date) = YEAR(CURDATE()) THEN 1 ELSE 0 END) 
      as CountAcctsThisYear 
FROM Accounts a 
INNER JOIN User u ON u.id = a.userid 
GROUP BY a.userid; 
+0

@Benjam:我認爲主表應該是帳戶和內部連接應該採取。所以用戶必須出現在用戶表中。它會避免重複。並會得到適當的結果。 – 2012-01-27 05:29:40

+0

沒有帳戶的用戶失敗。有一個原因OP使用LEFT JOIN 3列解決方案,對他來說效果很好。 – piotrm 2012-01-27 05:34:38

+0

我正在考慮該用戶將在帳戶表中至少有帳戶(行)。所以會得到用戶有帳戶的結果。如果不需要,則應該進行左連接,並且表格順序會改變。 – 2012-01-27 05:48:14