2015-09-24 56 views
0

我一直在玩弄這個看起來像是幾個小時,我無法得到我想要的結果。這裏是我遇到的問題:MySQL按年份總結總數

SELECT year.year, dstate, 
    (SELECT sum(amount) FROM gift 
     WHERE year.year = gift.year 
     AND gift.donorno = donor.donorno) 
    FROM donor, gift, year 
     WHERE year.year = gift.year 
     AND gift.donorno = donor.donorno; 

這似乎是多餘的。無論如何,我正在嘗試顯示每年每個州的總捐款(gift.amount)。

ex. 
1999 GA 500 (donorno 1 from GA donated 200 and donorno 2 from GA donated 300) 
1999 FL 400 
2000 GA 600 
2000 FL 500 
... 

爲了澄清捐助者可以來自同一州,但我試圖將捐贈年份的捐贈總額計算在該州。 任何意見表示讚賞。我覺得答案就在我面前。

下面是表的參考圖片: table diagram

回答

0

這是一個非常簡單的加入&聚集的問題。

SELECT y.year, d.state, SUM(g.amount) AS total 
FROM gift AS g 
INNER JOIN year AS y ON y.year=g.year 
INNER JOIN donor AS d ON d.donorno=g.donorno 
GROUP BY y.year, d.state 

您不需要SELECT子句中的子查詢就可以獲得總金額。你可以通過分組對它進行求和。 (我認爲GROUP BY子句就是缺少的東西,我建議讀一下它。)你所做的就是所謂的相關子查詢,它將比大數據集慢很多,因爲它必須是逐行計算而不是作爲集合操作。

此外,請不要使用舊式逗號連接語法。而是使用上面顯示的顯式連接語法。它更清晰,有助於避免意外的笛卡爾產品。

+0

謝謝。正如你可能會告訴我,我是SQL新手,目前正在參加一門入門課程。我不完全確定你的意思是「舊式逗號語法」。我還必須閱讀如何使用INNER JOIN關鍵字。我的一些實驗讓我使用GROUP BY,但我不知道可以將它用於多列。顯然這是我的問題。我將不得不更多地瞭解這一點! – Colin93

+0

連接可以通過列出FROM子句中的表格並使用逗號分隔它們,然後在WHERE子句中指定連接語法來完成。如果你忘記把連接條件放在你的笛卡爾積中(每個表的每一行都會連接到其他表的每一行,所以你會得到'(Table1 Rows)*(Table 2 Rows)*(Table 3行)')這可能不是你想要的。通過使用顯式的JOIN語法,可以更容易地看出您是否忘記了連接的條件。瞭解INNER,LEFT,RIGHT和CROSS join之間的區別是一項重要的技能。 –