如何获得按日期范围在不同行中列出的mysql结果?

如何获得按日期范围在不同行中列出的mysql结果?,mysql,Mysql,我在页面上正确显示数据方面遇到了困难。我正在运行一个账单报告查询,该报告搜索所有未付账单,我希望在一个页面上显示这些账单,未付余额按余额的年限显示。因此,如果客户ABC在过去一年中有10张发票,其中一些发票有未付余额,我想在0-30/30-60/60-90/和90天以上的列中显示这些余额。这是我所拥有的 $sql17 = "SELECT $mysql_billing.primary_key, $mysql_billing.a_name, $mysql_billing.invoicedat

我在页面上正确显示数据方面遇到了困难。我正在运行一个账单报告查询,该报告搜索所有未付账单,我希望在一个页面上显示这些账单,未付余额按余额的年限显示。因此,如果客户ABC在过去一年中有10张发票,其中一些发票有未付余额,我想在0-30/30-60/60-90/和90天以上的列中显示这些余额。这是我所拥有的

    $sql17 = "SELECT $mysql_billing.primary_key, $mysql_billing.a_name, $mysql_billing.invoicedate, $mysql_billing.finaltotal, $mysql_billing_dates.paidtotal,
 ($mysql_billing.finaltotal - $mysql_billing_dates.paidtotal) AS total
 FROM
   (SELECT $mysql_billing.primary_key, $mysql_billing.a_name, $mysql_billing.login_username, $mysql_billing.invoicedate,
   SUM($mysql_billing.custotal) AS finaltotal 
   FROM $mysql_billing where $today >= invoicedate AND $start_search_prev180_date <= invoicedate AND custotal != payments GROUP BY login_username) $mysql_billing 
 LEFT JOIN 
   (SELECT $mysql_billing_dates.id, $mysql_billing_dates.username, 
   SUM($mysql_billing_dates.amount) AS paidtotal 
   FROM $mysql_billing_dates where complete != 'yes' GROUP BY username) $mysql_billing_dates 
 ON ($mysql_billing.login_username = $mysql_billing_dates.username) 
 GROUP BY a_name ORDER BY a_name ASC";

这似乎可以打印出结果,但是如何根据一个以上的日期变量将结果放入不同的列中呢?我是否需要进行4个单独的查询?

我建议为客户选择所有未付发票,然后使用代码将这些发票组织到每个时间段的列表中

为此使用单个查询可能会更快,并且很容易在程序中对结果进行分类


然后,您只需在每个列表中选择一个元素来生成报告中的行。

您的SQL FIDLE很接近,但有一些联接不正确

SELECT 
  billing.a_name, 
  billing.finaltotal, 
  billing_dates.paidtotal,
  (billing.finaltotal - billing_dates.paidtotal) AS total,
   billing.TimePeriod
FROM
   (SELECT 
      a_name, 
      login_username, 
      SUM(custotal) AS finaltotal,
      CASE 
        WHEN invoicedate > DATE_SUB(CURDATE(),INTERVAL 30 DAY) THEN '30'
        WHEN invoicedate > DATE_SUB(CURDATE(),INTERVAL 60 DAY) THEN '60'
        WHEN invoicedate > DATE_SUB(CURDATE(),INTERVAL 90 DAY) THEN '90'
        ELSE '90+'
      END AS TimePeriod

    FROM billing 
    where CURDATE() >= invoicedate 
      AND CAST(20120601 AS DATETIME) <= invoicedate 
    GROUP BY login_username) billing 
 LEFT JOIN 
   (SELECT 
      username, 
      SUM(amount) AS paidtotal 
    FROM billing_dates
    GROUP BY username) billing_dates 
   ON (billing.a_name = billing_dates.username) 
ORDER BY a_name ASC;

这是最新版本。

您是在PHP中执行此操作的吗?我猜您可能希望在PHP中循环4个日期范围,每次使用日期变量运行查询,并将结果放入数组中显示。查询和数据库结构没有那么清楚。你能安装一个SQL小提琴吗。好的,我做到了。我认为我的查询是混乱的,因为结果甚至不是我想要的。这里是链接。基本上,对于90+日期选择,def1应显示621.52的余额,abc1应显示44.6的余额,90+日期选择,完整列在哪里?完成是'你有这个过程的任何例子吗?现在它正在提取正确的值,如何根据invoicedate结果在4列中显示它?请参阅上面的回答和修改。祝你好运——这会让你朝着正确的方向前进。假设硬编码的日期实际上是今天,那么这就行了。我更新了你的表defs,得到了不同的结果,也得到了大部分结果,空值的东西。只是现在尝试将结果包含在billing中,但不包含在billing_Date中。如果我删除下面的行,它将从两个表中提取所有结果,这正是我想要的。如果有人在结账,但不在结账日,它仍然显示他们的余额为0.00。听起来对吗?将20120601转换为DATETIME ok,所以我遇到了一个问题,希望你们知道。如果用户的账单日期有两行,并且只有一行是付费的,即:第一行,则invoicedate代码段仅查看表中的第一行以显示30/60/90。它确实正确地提取了美元金额,但它应该如何识别第二行数据并将其用于30/60/90?