0

私は、(とにかく)単純な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}

など…</p>

今、私はこれが正しくないことを知っていますが、私が扱っているクエリは次のようになります:

$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

4

1 に答える 1

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集計関数でラップし、クライアントでGROUPBYを実行します。

NULL値を返さないようにする場合は、それらのSUM式を次のようにラップできます。IFNULL( ... ,0)

于 2012-12-30T01:30:34.103 に答える