按周汇总两个日期列的COUNT个

时间:2016-06-07 20:04:05

标签: mysql date calendar

我想按周总结一些COUNT数据。这周从星期日开始。查询必须考虑COUNT为0的周数。计数在两个日期。推荐日期和服务日期。我想要做的就是计算每周推荐的数量以及同一周内有多少服务日期。这两个COUNTS没有关联。转介可能会在一周内完成,但服务会在一周内完成。

我的尝试: 1)我创建了一个日历表,其中包含我工作期间每天的条目。日期条目涵盖的时间超过了使用的时间段。 2)我的选择中有一个字段,按周开始汇总' 3)我在每个日期字段(推荐,访问)上都有COUNT个字段。请注意,我使用了Distinct,因为访问时有多个服务代码,但我只需要将它们计为1。

以下是代码:

select
STR_TO_DATE(DATE_FORMAT(FROM_DAYS(TO_DAYS(calendar.datefield) - MOD(TO_DAYS(calendar.datefield) -1, 7)),'%m/%d/%Y'), '%m/%d/%Y' ) AS `Week Beginning`,

COUNT(DISTINCT opsData.`Patient Last Name`, opsData.`Patient First Name`, opsData.Discipline, opsData.`Referral Date`) as `Referrals`,

COUNT(DISTINCT opsData.`Patient Last Name`, opsData.`Patient First Name`, opsData.`Date of Service`) as Visits

from opsdata RIGHT JOIN calendar ON (DATE(opsData.`Referral Date`) = calendar.datefield)

where (calendar.datefield BETWEEN (SELECT MIN(DATE(opsData.`Referral Date`)) FROM opsdata) AND (SELECT MAX(DATE(opsData.`Referral Date`)) FROM opsdata))
group by `Week Beginning`
order by `Week Beginning` ASC

我遇到的问题是我只能根据RIGHT JOIN一次获得一个COUNTS准确。如果我使用DATE(opsData。Referral Date),那么引荐COUNT是正确的并且访问是错误的。如果我使用DATE(opsData。Date of Service),则访问次数正确且推荐COUNT错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您需要使用2个字段的早期/最新日期。您可以使用least() and greatest() functions来实现此目的:

...BETWEEN (SELECT least(MIN(DATE(opsData.`Referral Date`)),min(date(opsData.`Date of Service`))) FROM opsdata)
   AND (SELECT greatest(MAX(DATE(opsData.`Referral Date`)), max(date(opsData.`Date of Service`))) FROM opsdata))

答案 1 :(得分:0)

我最近在MySQL: multiple count in one row

上回答了类似的问题

您基本上需要做的是生成一个周列表。 如果您希望每周开始,并将日期作为组,则可以使用。

(SELECT date(adddate(datetime, INTERVAL 1-DAYOFWEEK(datetime) DAY)) as week
FROM (
    select (curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) Week) as datetime
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) AS t
where datetime > '2016' -- enter your earliest year here
ORDER BY datetime ASC) week_list

然后你要做的就是对你想要的计数进行连接查询。     即

(select date_format(timestamp,'%X-%V') theweek, count(id) from table where ______ group by theweek) on week_list.week=table.theweek

请注意,如果你理解我的意思,联接的格式必须匹配。

任何问题都让我知道。但希望这个和之前的帖子可以帮助你。

布雷特