每个部门每个月的帐单周期应该只有一个对帐单。
我的目标是找出在同一计费周期内有多个账单被打到多少个部门。
上下文:
我当前的查询设置为仅检查应该按月计费的部门。
部门表与对帐单表具有一对多关系(一个部门在每个计费周期结束时应有一个对帐单)
每个帐单都有自己的截止日期
a.payment_period = 1代表按月计费的部门
我还尝试了在每个帐户的特定到期日期之间进行搜索。
我的查询的问题是它输出帐单截止日期的总数,而不是仅检查帐单周期内是否多次出现。
如何将此查询修改为仅在每个部门的帐单周期内发生多个每月帐单实例的输出部门?
查询:
SELECT s.department, s.statement, COUNT(s.closed_date) AS sd, from_unixtime(s.closed_date)
FROM statement s
INNER JOIN department d
ON s.department=d.department
WHERE from_unixtime(s.closed_date) BETWEEN
DATE_SUB(from_unixtime(d.exp_date), INTERVAL 1 MONTH) AND
from_unixtime(d.exp_date)
AND d.period=1
GROUP BY s.statement DESC
HAVING sd>1
样品输出:
department statement sd closed_date
1719712 9351464 3 2018-09-24
1719709 9351463 2 2018-09-24
1719708 9351462 2 2018-09-24
1719665 9351457 3 2018-09-24
答案 0 :(得分:0)
您似乎想按月分组。
在MySQL中,the LAST_DAY()
function.是一项工作,您需要的模式是:
SELECT a, b, LAST_DAY(datestamp) month_ending, SUM(c) c, MAX(d) maxd
FROM table
GROUP BY a, b, LAST_DAY(datestamp)
因此,对于您的情况,您首先要查找任何给定月份中有一张以上发票的情况。
我不得不猜测,因为我不了解exp_date
的含义。这应该做您想要的。
SELECT s.department, LAST_DAY(FROM_UNIXTIME(s.closed_date)) month_ending,
COUNT (*) statement_count
FROM statement s
JOIN department d ON s.department = d.department
WHERE d.period = 1
AND s.closed_date >= (FROM_UNIXTIME(d.exp)) - INTERVAL 1 MONTH
AND s.closed_date < (FROM_UNIXTIME(d.exp))
GROUP BY s.department, LAST_DAY(FROM_UNIXTIME(s.closed_date))
HAVING COUNT(*) > 1
这给出了一个结果集,每个部门每月有一行,并经过过滤,因此只显示具有多个发票的部门。