2012-12-30 1 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} 

그리고 ... 이제

아니라 쿼리 I는 다음과 같다 함께 일하고 있어요 :

$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 식을 포장 할 수 있습니다! Spencer에게 감사드립니다. 매우 감사. – rrfive