2016-06-07 33 views
1

我想每週總結一些COUNT數據。這周從星期天開始。該查詢必須佔COUNT爲0的星期。計數在兩個日期。推薦日期和服務日期。我想要做的就是統計每週的推薦次數以及同一周內有多少個服務日期。這兩個COUNTS沒有關聯。推薦可能會在1周內出現,但服務會再過一週完成。以COUNT兩個日期列的星期總結

我的嘗試: 1)我創建了一個日曆表,其中包含我工作期間每天的條目。日期條目涵蓋的時間超過了使用期限。 2)我在我的Select中有一個字段,由'Week Beginning'總結爲 3)我在每個日期字段(引薦,訪問)上都有COUNT字段。請注意,我用的不同,因爲有一個訪問多個服務代碼,但我只需要他們算作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中的1個準確的時間。如果我使用DATE(opsData。Referral Date),則推薦計數正確,訪問錯誤。如果我使用DATE(opsData。Date of Service),那麼訪問是正確的,並且推薦COUNT是錯誤的。

任何想法?

回答

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)) 
+0

我得到了與您推薦的新代碼相同的結果。要運行測試以查看where子句是否是問題,我將其更改爲:calendar.datefield> = date('2016/01/01')和calendar.datefield <= date('2016/06/10')和我得到了與您的代碼和我的原始代碼相同的結果。 – Gsm

+0

在這種情況下,您需要提供樣本數據,您從查詢中收到的實際輸出以及預期結果作爲對問題的編輯。 – Shadow

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 

NB是聯接的格式有,如果你明白我的意思相匹配。

有任何問題讓我知道。但希望這和以前的帖子可以幫助你。

Brett

相關問題