Ich versuche Folgendes zu erreichen - Ich möchte die Sitzung auf meiner Website pro Kunde gruppiert nach Kalenderwoche sehen. Hier ist die Abfrage ich habe so weit, dies zu erreichen:MYSQL - Nach Wochen gruppieren, während Wochen ohne Werte angezeigt werden
SELECT o.name
, s.organization_id
, count(s.id) as num_of_sessions
, CONCAT(s.created_at, ' - ', s.created_at + INTERVAL 6 DAY) AS week
FROM triton.sessions s
, triton.organizations o
where o.id=s.organization_id
and s.organization_id in (17,19,20,21,24,25,26,27,29,31,32,33,34,25,36,37,38,39,40,41,43,44,45,46,47,48,49,50,51,52,53,56,57,58,59,60,62,69,70,72)
GROUP BY s.organization_id, WEEK(s.created_at)
ORDER BY o.name, WEEK(s.created_at);
Das Problem dabei ist, dass Wochen mit dem ein Kunde hat keine Website-Sitzung hat nicht mit einem 0 gemeldet werden - statt in dieser Woche nicht gemeldet . Dies ist ein Problem, da ich die Daten nicht einfach in Excel übernehmen kann und Diagramme für die Sitzungen jedes Kunden erstellen kann.
Um zu versuchen, dieses Problem zu beheben, habe ich eine temporären Wochen Tabelle mit Werten von 1 bis 52 für jede Woche und versuchte der Ansatz in diesem Link vorgeschlagen: Summarise by week, even for empty rows
Die Herausforderung ist, wenn ich eine linke äußere tun Beitreten, ich verliere die Gruppe für Organisationen.
Hier ist ein funktionierendes SQL von Wochen auf nur Gruppe verwendet (vor durch Organisation Gruppe versucht):
select w.weeknum
, sess.club
, sess.organization_id
, count(sess.club) from weeks w
left outer
join (select o.name as club
, s.organization_id
, s.created_at
from sessions s
, organizations o
where s.organization_id in (17,19,20,21,24,25,26,27,29,31,32,33,34,25,36,37,38,39,40,41,43,44,45,46,47,48,49,50,51,52,53,56,57,58,59,60,62,69,70,72)
and o.id=s.organization_id
) sess
on (w.weeknum = extract(week from sess.created_at))
group by w.weeknum
Der obige Code gibt nur 52 Zeilen (1 für jede Woche), mit der Graf mir geben Wie viele Sitzungen in jeder Woche.
Ich möchte jetzt den oben genannten Code, um die oben genannten aber pro Organisation zu erweitern. Ich sollte 52 * N Zeilen zurückbekommen, wobei N die Anzahl der Organisationen ist. Ich dachte, das wäre so einfach wie das Hinzufügen der Organisation zur groupby-Anweisung, aber es gab nur die Wochen zurück, die Sitzungen hatten (was zu dem Problem führte, das ich von Anfang an hatte). Hier ist die Abfrage:
select w.weeknum
, sess.club
, sess.organization_id
, count(sess.club)
from weeks w
left outer
join (select o.name as club
, s.organization_id
, s.created_at
from sessions s
, organizations o
where s.organization_id in (17,19,20,21,24,25,26,27,29,31,32,33,34,25,36,37,38,39,40,41,43,44,45,46,47,48,49,50,51,52,53,56,57,58,59,60,62,69,70,72)
and o.id=s.organization_id
) sess
on (w.weeknum = extract(week from sess.created_at))
group by sess.club, w.weeknum
order by sess.club
Hat jemand andere Vorschläge, wo ich meine Ziele erreichen kann? Im Wesentlichen möchte ich für jeden meiner Kunden eine Liste von Sitzungen pro Woche anzeigen (auch wenn sie in einer bestimmten Woche keine Sitzung hatten).
Ich denke, Sie erhalten bessere Antworten, wenn Sie verkürzen deine te xt und formatiere deinen Code –