2010-03-16 42 views
2

我有2個表中的數據,我想創建一個報告。sql select語句與組通過

表A:

  • tableAID(主鍵)
  • 名稱

表B:

  • tableBID(主鍵)
  • 標籤leAID(外鍵,參考表A)

這兩個表還有很多,但這些是相關的列。

我想要運行的查詢,從概念上講,是這樣的:

select TableA.name, avg(TableB.grade) where TableB.tableAID = TableA.tableAID 

當然,問題是,我使用的是聚合函數(AVG),我可以把它改寫這樣的:

select avg(grade), tableAID from TableB group by tableAID 

但是我只能得到TableA的ID,而我真的需要名稱列出現在TableA中,而不僅僅是ID。

是否可以在一個語句中編寫查詢來完成此操作,還是我首先需要執行列出的第二個查詢,獲取id列表,然後查詢TableA中每個記錄的名稱列...在我看來,我失去了一些東西很明顯這裏,但我(很明顯)不是SQL大師...

回答

3

你可以這樣做:

SELECT avg(b.grade), a.tableAID, a.name 
FROM TableA a 
    JOIN TableB b 
     ON b.tableAID = a.tableAID 
GROUP BY a.tableAID, a.name 

它只是增加了組將工作在你的情況罰款。

+0

+1對於響應速度 - 是發佈後的15秒或20秒! – amelvin 2010-03-16 18:21:47

+0

是的,不知何故,他預先計算答案。或者可能只是一個非常好的緩存算法。 – 2010-03-16 19:06:26

+0

@amelvin,@Larry - 我承認,我是一個機器人:( – 2010-03-16 19:11:17

2
SELECT AVG(TableB.grade), TableB.tableAID, TableA.Name 
     FROM TableA INNER JOIN TableB 
     ON TableA.TableAID = TableB.TableAID 
     GROUP BY TableA.tableAID, TableA.Name 
+1

+1鼓勵您構建更好的預嵌齒算法 – amelvin 2010-03-17 00:05:44

0

備選答案:

SELECT AVG(b.grade), a.tableAID, MAX(a.name) 
FROM TableA a 
    JOIN TableB b 
     ON b.tableAID = a.tableAID 
GROUP BY a.tableAID 

只是爲了讓你的思維。