【问题标题】:SQL Query Issues - Sum of client spend per yearSQL 查询问题 - 每年客户支出的总和
【发布时间】:2012-12-30 01:19:31
【问题描述】:

我正在尝试构建(无论如何在我看来)应该是一个简单的 SQL 查询,以了解每个财政年度为客户开具的发票。输出可能如下所示:

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

我能够实现的是如下所示的输出:

{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

【问题讨论】:

    标签: php mysql sql


    【解决方案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 值,则可以将这些 SUM 表达式包装在 IFNULL( ... ,0)

    【讨论】:

    • 工作就像一个魅力!谢谢斯宾塞。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多