2013-04-03 129 views
5

我有 '人民'T-SQL SELECT與GROUP BY ID

  • ID
  • 名稱
  • 年齡

而且表「表備註':

  • ID
  • 文本
  • FK_Author

我想選擇的音符數從人表中的所有作者和他們的名字和年齡,但我希望將它通過人員ID,而不是姓名。有很多情況下,人們有相同的名字,但ID顯然總是不同的。

實施例(輸入)

人物:

╔════╦═══════╦═════╗ 
║ ID ║ NAME ║ AGE ║ 
╠════╬═══════╬═════╣ 
║ 1 ║ John ║ 12 ║ 
║ 2 ║ Annie ║ 29 ║ 
║ 3 ║ John ║ 44 ║ 
╚════╩═══════╩═════╝ 

NOTES:

╔════╦═══════╦═══════════╗ 
║ ID ║ TEXT ║ FK_AUTHOR ║ 
╠════╬═══════╬═══════════╣ 
║ 1 ║ 'aaa' ║   1 ║ 
║ 2 ║ 'aaa' ║   1 ║ 
║ 3 ║ 'aaa' ║   2 ║ 
║ 4 ║ 'aaa' ║   2 ║ 
║ 5 ║ 'aaa' ║   3 ║ 
╚════╩═══════╩═══════════╝ 

預期結果:

╔═══════╦═════╦════════════╗ 
║ NAME ║ AGE ║ TOTALCOUNT ║ 
╠═══════╬═════╬════════════╣ 
║ John ║ 12 ║   2 ║ 
║ Annie ║ 29 ║   2 ║ 
║ John ║ 44 ║   1 ║ 
╚═══════╩═════╩════════════╝ 

當我選擇數據時,如果我想選擇此列,我也必須按名稱進行分組,因爲如果我沒有,我會得到錯誤。

回答

5

既然你想從表People所有記錄,您需要使用LEFT JOIN因此沒有任何紀錄Notes任何用戶將被包括在具有thev零的totalCount值列表與Notes加入。

SELECT a.ID, a.Name, a.Age, 
     COUNT(b.FK_Author) totalCount 
FROM People a 
     LEFT JOIN Notes b 
      ON a.ID = b.FK_Author 
GROUP BY a.ID, a.Name, a.Age 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

輸出

╔════╦═══════╦═════╦════════════╗ 
║ ID ║ NAME ║ AGE ║ TOTALCOUNT ║ 
╠════╬═══════╬═════╬════════════╣ 
║ 1 ║ John ║ 12 ║   2 ║ 
║ 2 ║ Annie ║ 29 ║   2 ║ 
║ 3 ║ John ║ 44 ║   1 ║ 
╚════╩═══════╩═════╩════════════╝ 
+0

這是錯誤的答案,就像我說我不要被名字/年齡螞蟻羣。這個專欄對於不同的人可以是相同的 – Ellbar

+2

NO。你錯了。這個查詢會給你你需要的結果。請記住,您在「GROUP BY」條款 –

+0

中包含「ID」,請參閱此處演示http://www.sqlfiddle.com/#!3/81929/1 –

3
SELECT P.ID,P.Name,P.Age,COUNT(N.ID) 
FROM People P 
INNER JOIN Notes N ON N.FK_Author = P.ID 
GROUP BY P.ID,P.Name,P.age 
+0

您必須按選擇中要顯示的所有字段進行分組,但由於您先按ID進行分組,他們將全部不同。 –

2

您可以使用子查詢也來完成這一任務原樣

select people.Name,people.Age,(select count(notes.id) 
           from notes 
           where notes.FK_Author= people.id) 
from people; 
2

你也可以首先從票據表的計數,然後離開與人民表連接像下面。

Fiddle-demo(感謝給J W代表小提琴)

select name, age, Notate_Count 
from People p left join (
     select fk_author, count(*) Notate_Count 
     from Notes 
     group by fk_author) x 
    on p.Id = x.fk_author 
order by name --Ordering by name here, change as required 

| NAME | AGE | NOTATE_COUNT | 
------------------------------ 
| Annie | 29 |   2 | 
| John | 44 |   1 | 
| John | 12 |   2 |