我有一个名为 payment 的表,它有日期字段,我有一个叫 Mark 的客户,他已经连续 3 年每天付款了
Table: Payment
Fields: Name , Amountpaid, date
我想显示mark每3个月的付款记录以及3年的总付款金额
我希望结果是什么样的
First 3 months payment record table
total Amountpaid at the bottom of the table
second 3 months payment record table
total Amountpaid at the bottom of the table
Third 3 months payment record table
total Amountpaid at the bottom of the table
以此类推3年
请大家帮忙
最佳答案
您似乎正在为此寻找 SQL 解决方案,但数据库是用于保存数据的,而不是用于将其格式化为报告的。为此,我的建议是:不要尝试在数据库中执行此操作,而是在前端代码中执行此操作
运行这样的查询将非常简单
SELECT * FROM payment WHERE
name = 'mark' and
`date` between date_sub(now(), interval 3 year) and now()
ORDER BY date
然后使用循环将结果放入 HTML 表中,并使用一个变量来跟踪支付总额。每 3 个月重置一次变量。如果你想让 MySQL 做更多的数据处理来帮助你,你可以这样做:
SELECT * FROM
payment
INNER JOIN
(SELECT YEAR(`date`) + (QUARTER(`date`)/10) as qd, SUM(amountpaid) as qp FROM payment WHERE name = 'mark' GROUP BY YEAR(`date`), QUARTER(`date`)) qpt
ON
qpt.qd = YEAR(`date`) + (QUARTER(`date`)/10)
WHERE
name = 'mark' AND
`date` between date_sub(now(), interval 3 year) and now()
ORDER BY `date`
这将逐行提供所有标记的数据,并额外提供两列(大部分会一遍又一遍地重复),显示一年中的年份和季度(3 个月),例如 2017.1、2017.2,以及所有付款的总和那个季度制作的。现在在前端对其进行格式化不需要变量来保存支付金额的运行总额
这是关于格式化数据库中的数据时应执行的操作的限制(个人观点)。但是,如果您决定让 MySQL 完成所有这些工作,请继续阅读..
Ysth提到了rollup,它的目的是汇总数据..这样的解决方案看起来像这样:
SELECT
Name, `date`, SUM(amountpaid) as amountpaid
FROM
payment
WHERE
name = 'mark' AND
`date` between date_sub(now(), interval 3 year) and now()
GROUP BY
name,
YEAR(`date`) + (QUARTER(`date`)/10),
`date`
WITH ROLLUP
这种方法的唯一缺点是您还会获得按标记显示的所有付款的总计行。要抑制这种情况,请改用分组集:
SELECT
Name, `date`, SUM(amountpaid) as amountpaid
FROM
payment
WHERE
name = 'mark' AND
`date` between date_sub(now(), interval 3 year) and now()
GROUP BY GROUPING SETS
(
(
name,
YEAR(`date`) + (QUARTER(`date`)/10),
`date`
),
(
name,
YEAR(`date`) + (QUARTER(`date`)/10)
)
)
关于php - 显示过去 3 年中每 3 个月按标记支付的付款,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46066326/