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