SQL查询问题-客户端每年花费的总和


SQL Query Issues - Sum of client spend per year

我试图建立什么应该是(在我的脑海中无论如何)一个简单的SQL查询,以了解客户已开发票每个财政年度。输出可能如下所示:

{clientName (Client 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

你可以尝试这样做:

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值,那么您可以将这些SUM表达式包装在IFNULL( ... ,0)

中。