2012-12-30 24 views
0

我正在嘗試構建一個簡單的SQL查詢,以瞭解每個財政年度的客戶已開具發票。輸出可能是這樣的:SQL查詢問題 - 每年客戶支出總和

{CLIENTNAME(客戶端A)} - {2010/2011值} - {2011/2012值} - {2012/2013值}

我已經能夠實現是一個輸出看起來像這樣:

{clientName (Client A)} - {2010/2011 Value} 
{clientName (Client A)} - {2011/2012 Value} 
{clientName (Client A)} - {2012/2013 Value} 
{clientName (Client B)} - {2010/2011 Value} 

等等......

現在,我知道這是不是正確的,但查詢我與工作看起來像這樣:

$query = "SELECT i.invoiceValue, fy.year, c.clientName, c.clientID FROM cms_invoices i 
LEFT JOIN cms_financialYear fy ON fy.yearID = i.yearID 
LEFT JOIN cms_projects p ON p.projectID = i.projectID 
LEFT JOIN cms_clients c ON c.clientID = p.clientID 
ORDER BY fy.year, c.clientName"; 
$result = mysql_query($query) or die(mysql_error()); 
while($row = mysql_fetch_array($result)) { 
echo $row['year'] . " - "; 
echo $row['clientName'] . " - $"; 
echo number_format($row[invoiceValue], 2, '.', ',') . ""; 
echo "<br>"; 

我會很感激,如果我能得到這種指導。我已經嘗試了幾個小時,但唉,沒有運氣。

感謝, @rrfive

回答

1

你可以嘗試這樣的事:

SELECT c.clientID 
    , c.clientName 
    , SUM(IF(fy.year=2010,i.invoiceValue,0)) AS fy_2010 
    , SUM(IF(fy.year=2011,i.invoiceValue,0)) AS fy_2011 
    , SUM(IF(fy.year=2012,i.invoiceValue,0)) AS fy_2012 
    FROM cms_invoices i 
    LEFT 
    JOIN cms_financialYear fy ON fy.yearID = i.yearID 
    LEFT 
    JOIN cms_projects p ON p.projectID = i.projectID 
    LEFT 
    JOIN cms_clients c ON c.clientID = p.clientID 
GROUP BY c.clientID, c.clientName 
ORDER BY c.clientID, c.clientName 

的 「絕招」 是使用IF功能(或更ANSI便攜式CASE表達式),以確定是否一行適用於給定的會計年度。如果是,則返回發票值,否則返回0.

將這些表達式包裝在SUM聚合函數中,並在客戶端上執行GROUP BY。

如果你想防止返回NULL值,那麼你可以用在IFNULL(... ,0)

+0

工作就像一個魅力的SUM表情!謝謝斯賓塞。非常感激。 – rrfive