2016-06-07 11 views
1

Ich möchte einige COUNT Daten nach Woche zusammenfassen. Die Woche beginnt am Sonntag. Die Abfrage muss für Wochen, wo die COUNT 0 ist, berücksichtigen. Die Zählungen sind an zwei Daten. Ein Überweisungsdatum und das Servicedatum. Alles, was ich tun möchte, ist die Anzahl der Empfehlungen für jede Woche zu zählen und wie viele Service-Daten gibt es in der gleichen Woche. Diese beiden COUNTS sind nicht verknüpft. Eine Überweisung kann in 1 Woche kommen, aber der Service wird eine weitere Woche erledigt.Zusammenfassung nach Woche mit COUNT von zwei Datumsspalten

Mein Versuch: 1) Ich habe eine Kalender-Tabelle mit einem Eintrag für jeden Tag für den Zeitraum, den ich arbeite, erstellt. Die Datumsangaben umfassen mehr als den verwendeten Zeitraum. 2) Ich habe ein Feld in meiner Auswahl, die nach 'Woche Anfang' zusammenfasst 3) Ich habe COUNT Felder in jedem der Datumsfelder (Referral, Visits). Beachten Sie, dass ich Distinct verwenden, da es mehrere Service-Codes für einen Besuch sind, aber ich brauche sie nur als 1.

Hier zu zählen ist der Code:

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 

Das Problem, das ich habe, ist, dass ich nur 1 von den ZÄHLEN bekommen kann, um auf der RECHTEN VERBINDUNG zu einer Zeit genau zu sein. Wenn ich DATE (opsData. Referral Date) verwende, dann ist der Verweis COUNT korrekt und die Besuche sind falsch. Wenn ich DATE (opsData. Date of Service) verwende, dann sind die Besuche korrekt und der Verweis COUNT ist falsch.

Irgendwelche Ideen?

Antwort

0

Sie müssen die Earlies/spätestes Datum der 2 Felder verwenden. Sie können least() and greatest() functions verwenden, um dies zu erreichen:

...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

Ich habe das gleiche Ergebnis mit dem neuen Code, den Sie empfohlen. Um einen Test auszuführen, um zu sehen, ob die WHERE-Klausel das Problem ist, habe ich sie in: calendar.datefield> = date ('2016/01/01') und calendar.datefield <= date ('2016/06/10') und geändert Ich habe das gleiche Ergebnis wie mit Ihrem Code und meinem ursprünglichen Code. – Gsm

+0

In diesem Fall müssen Sie Beispieldaten, die tatsächliche Ausgabe, die Sie von Ihrer Abfrage erhalten, und das erwartete Ergebnis als Bearbeitung der Frage bereitstellen. – Shadow

0

antwortete ich eine ähnliche Frage vor kurzem auf MySQL: multiple count in one row

Was Sie im Grunde tun müssen, ist eine Liste der Wochen zu generieren. Wenn Sie wollen, Woche und ein Datum als die Gruppen dann können Sie verwenden.

(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 

Dann, was Sie tun bleibt Abfragen von Zählungen verbinden, die Sie wollen. dh

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

NB, dass die Formate der Join anzupassen, wenn Sie bekommen, was ich meine.

Alle Probleme lassen Sie mich wissen. Aber hoffentlich hilft dir diese und die vorherige Post.

Brett