2016-04-21 4 views
1

Ich habe drei TabellenAusgabe

Tabelle 1

c_id c_name   status p_id   created_at 
1  john   1   79  2016-04-13 10:36:44  
2  smith   1   79  2016-04-13 14:25:57 
3  phil   1   76  2016-04-18 18:06:21 
4  leo    1   76  2016-04-18 15:51:41 
5  craig   1   79  2016-04-20 10:44:17 
... 

Tabelle 2

p_id  p_name       
75   test1    
76   test2    
77   test3    
78   test4    
79   test5    
... 

Tabelle 3

id  c_id       
1   1    
2   1    
3   3    
4   4    
5   4    

Ich brauche das Ergebnis:

period  p_id p_name total_count active_count cance_count no_of_occur   
2016-04-13 79  test5 2   2   0   2 
2016-04-18 76  test2 2   2   0   2 
2016-04-20 79  test5 1   1   0   1 
... 

Für Code, den ich schrieb quert, aber es gibt mir falsche Zählung

SELECT 
    DATE(DATE_ADD(created_at, INTERVAL 19800 SECOND)) AS period, table1.p_id, 
    MIN(mdcpev.value) AS product_name, 
    COUNT(table1.c_id) AS total_count, 
    SUM(status = 1) AS active_count, 
    SUM(status = 2) AS cancel_count, 
    COUNT(table3.id) AS no_of_occur, 
    FROM table1 
     INNER JOIN table2 AS mdcpev ON mdcpev.p_id = p_id 
     LEFT JOIN table3 AS mdspo ON mdspo.c_id = tabe1.c_id 
     GROUP BY DATE(DATE_ADD(created_at, INTERVAL 19800 SECOND)),p_id 

EDIT

mein aktuelles Abfrageer ist

period  p_id p_name total_count active_count cance_count no_of_occur   
    2016-04-13 79  test5 3   3   0   3 
    2016-04-18 76  test2 3   3   0   2 
    2016-04-20 79  test5 1   1   0   1 

Hier bekam ich active_count 3 was falsch ist, sollte es 2 und no_of_occur sollte 2 sein und es wird derzeit angezeigt 3 Kann mir jemand zu dem was ist falsch in dieser Abfrage?

Danke

+1

, was Sie wollen bitte spezifisch zählen ?? –

+0

Und stellen Sie die Ausgabe Ihrer aktuellen Abfrage sowie – Shadow

+0

Bitte überprüfen Sie die Ausgabe @Shadow –

Antwort

1

Versuchen Sie diese Abfrage, es wird funktionieren.

SELECT 
     DATE_FORMAT(table1.created_at,'%Y-%m-%d'), 
     table1.p_id, 
     table2.p_name, 
     COUNT(table1.c_id) AS total_count, 
     COUNT(CASE WHEN status = 1 THEN table1.c_id ELSE NULL end) AS active_count, 
     COUNT(CASE WHEN status = 2 THEN table1.c_id ELSE NULL end) AS cancel_count, 
     COUNT(table3.id) AS no_of_occur 
      FROM table1 
      JOIN table2 
      on table2.p_id=table1.p_id 
      JOIN table3 
      ON table3.c_id=table1.c_id 
      Group by DATE_FORMAT(table1.created_at,'%Y-%m-%d'),table1.p_id 

Ausgang: I dumy Daten, wie sie von Frage nahm und versuchte, in meinem System ..

enter image description here

+0

Nein, es funktioniert nicht, es gibt mir auch das gleiche Ergebnis –

+0

Ich modifizierte Abfrage, entfernen deutlich jetzt überprüfen, weil ohne deutlich ich bekomme korrekte Ausgabe, ich habe in meinem System überprüft –

+0

Noch kein Glück. .. –

1

Tha Ursache für die Differenz ist der mit table3 verbinden, da Sie zweimal 1 und 4 in der C_Id Spalte haben und diese werden die Datensätze duplizieren.

würde ich die Zählungen wie folgt ändern:

COUNT(distinct table1.c_id) AS total_count, 
Count(distinct case when status = 1 then table1.c_id else null end) AS active_count, 
Count(distinct case when status = 2 then table1.c_id else null end) AS cancel_count, 
COUNT(distinct table3.id) AS no_of_occur, 

Die deutliche innerhalb der Zählung wird sichergestellt, dass nur unterschiedliche Werte gezählt. Sie werden jedoch weiterhin ein Problem mit no_of_occur haben. Wenn dies auf table3.id basiert, erhalten Sie im ersten Datensatz immer noch 3 für p_id 79, da sich der erste Datensatz in Tabelle 1 auf 2 Datensätze in Tabelle 3 und der zweite Datensatz in Tabelle 1 auf einen dritten Datensatz in Tabelle 3 bezieht. Also, ich glaube, Ihre Erwartungen sind entweder falsch oder Ihre no_of_occur Berechnung sollte nicht an Tabelle 3 gebunden sein. Aber in diesem Fall brauchen Sie nicht einmal Tabelle3 in der Abfrage. Das ist sg, nur du kannst antworten.

+0

mit distinct active_count erhalten die falsche Anzahl, wie Sie wissen, wenn ich 3 ID mit Status 1 dann es displayonly 1, aber ich brauche 3 active_count –

+0

mit COUNT (distinct table1.c_id) habe ich die richtige total_count. +1 von mir, aber jetzt bekomme ich falsche Statusanzahl (active_count und cancel_count) –

+0

Können Sie bitte genauer sein, was falsch bedeutet? – Shadow

1

SUM(status = 1) AS active_count, liefert diese immer wahr (1) für alle Bedingungen. Sie bekommen also eine falsche Ausgabe.

Ich hoffe, dass diese Abfrage funktioniert. Bitte überprüfen.

SELECT 
    DATE_FORMAT(table1.created_at,'%Y-%m-%d'), 
    table1.p_id, 
    table2.p_name, 
    COUNT(table1.c_id) AS total_count, 
    SUM(CASE WHEN status= 1 THEN 1 ELSE 0 END) AS active_count, 
    SUM(CASE WHEN status= 2 THEN 1 ELSE 0 END) AS cancel_count, 
    COUNT(table3.id) AS no_of_occur 
     FROM table1 
     JOIN table2 
     on table2.p_id=table1.p_id 
     JOIN table3 
     ON table3.c_id=table1.c_id 
     Group by DATE_FORMAT(table1.created_at,'%Y-%m-%d'),table1.p_id 
+0

immer noch nicht das eigentliche Ergebnis –