2017-08-09 1 views
0

Ich bin ziemlich neu in MySQL und brauche Hilfe, um eine Abfrage abzuschließen.Verbinden Sie 2 Abfragen für die gleiche Tabelle und fügen Sie eine Spalte zum Ergebnis hinzu.

Ich habe 2 separate Abfragen, die ich in nur einer Abfrage, die ich in PHP verwenden kann, benötigt.

Ich verwende die folgende SQL, um die Anzahl der Datensätze in einer Tabelle mit dem Namen 'Import' abzurufen, die ein Job_Completed_Date kleiner oder gleich dem Job_SLA_Due_Date haben.

Meine Where-Klausel prüft auf Jobs, die in den letzten 6 Monaten in der Import-Tabelle ausgeführt wurden.

SELECT Year(job_completed_date), 
     Month(job_completed_date), 
     Count(*) AS Completed_On_Schedule 
FROM import 
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month 
     AND job_completed_date <= job_sla_due_date 
     AND (job_status = 'C' 
       OR job_status = 'C2' 
       OR job_status = 'C8') 
GROUP BY Year(job_completed_date), 
      Month(job_completed_date) 
ORDER BY job_completed_date ASC 

Das Ergebnis Ausgang ist in Ordnung und erzeugt die folgenden ....

Year Month Completed_On_Schedule 
2017 3  1155 
2017 4  838 
2017 5  881 
2017 6  1095 
2017 7  1073 
2017 8  295 

Meine zweite Abfrage ist ähnlich die gleiche Tabelle verwenden, aber ich bin für die Gesamtzahl der Arbeitsplätze, die abgeschlossen sind in den letzten 6 Monaten, aber ich mache mir keine Sorgen um den Job_SLA_Due_Date. Die SQL ich verwende ist .......

SELECT Year(job_completed_date), 
     Month(job_completed_date), 
     Count(*) AS Total_Completed 
FROM import 
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month 
     AND (job_status = 'C' 
       OR job_status = 'C2' 
       OR job_status = 'C8') 
GROUP BY Year(job_completed_date), 
      Month(job_completed_date) 
ORDER BY job_completed_date ASC 

Das Ergebnis Ausgang wird als erwartet und erzeugt die folgenden .....

Year Month Total_Completed 
    2017 3  1441 
    2017 4  1101 
    2017 5  1144 
    2017 6  1334 
    2017 7  1211 
    2017 8  311 

Was ich jetzt brauchen, ist eine Ausgabe wie diese ......

Year Month Completed_On_Schedule Total_Completed %_On_Schedule 
    2017 3 1155     1441   80.1 
    2017 4 838     1101   76.1 
    2017 5 881     1144   77 
    2017 6 1095     1334   82 
    2017 7 1073     1211   88.6 
    2017 8 295     311    94.8 

Also kurz gesagt, die ich brauche, um meine zwei Abfragen zusammen und fügen Sie eine weitere Spalte namens% _Completed_On_Schedule beizutreten ist der Anteil der Arbeitsplätze im Zeitplan dh der Prozentsatz abgeschlossen, dass der Completed_On_Schedul Die Spalte gehört zur Spalte Total_Completed.

Jede Hilfe wird wirklich geschätzt.

Grüße

Alan

Antwort

1

nur ein bedingtes COUNT auf SELECT verwenden.

Aditional Spitze Verwendung IN anstelle von mehreren OR

SELECT Year(job_completed_date), 
     Month(job_completed_date), 
     COUNT(CASE WHEN job_completed_date <= job_sla_due_date 
        THEN 1 END) as Completed_On_Schedule, 
     COUNT(*) AS Total_Completed, 
     COUNT(CASE WHEN job_completed_date <= job_sla_due_date 
        THEN 1 END) * 100.0/
     COUNT(*) AS Total_Completed as `%_On_Schedule` 

FROM import 
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month 
     AND job_status IN ('C', 'C2', 'C8') 
GROUP BY Year(job_completed_date), 
      Month(job_completed_date) 
ORDER BY job_completed_date ASC 

Für Antwort, wie Sie zwei Join-Abfragen zusammen hier ein Beispiel (auch wenn Sie es nicht für diesen Fall brauchen):

SELECT Q1.*, Q2.* 
FROM (<your first query>) as Q1 
JOIN (<your second query>) as Q2 
    ON (Q1.year, Q1.month) = (Q2.year, Q2.month) 
+0

mit der Summe statt der Zählung zum Abrufen der nach Zeitplan abgeschlossenen Zählung funktioniert auch. – Acewin

+0

@Acewin Ich füge die 'JOIN'-Version hinzu, denn selbst wenn es für diesen Fall nicht nötig ist, ist es das, wonach OP fragt, und vielleicht wird es für ihn in einer anderen Situation nützlich sein. Ich mag es nicht, 'SUM (1/0)' zu benutzen, um zu zählen. Wenn Sie zählen, verwenden Sie 'COUNT()' –

+0

yeah realisierte ich. Deshalb habe ich meinen Kommentar aktualisiert. – Acewin

0

Ich habe in Ihrer Abfrage eine Spalte mit der Summe und einer CASE-Klausel hinzugefügt. Außerdem habe ich entfernt das UND für die SLA, weil wir es in der CASE_ haben

SELECT Year(job_completed_date), 
     Month(job_completed_date), 
     SUM(CASE 
       WHEN job_completed_date <= job_sla_due_date THEN 1 ELSE 0 
      END) AS Completed_On_Schedule, 
     Count(*) AS Total_Completed 
FROM import 
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month 
     AND (job_status = 'C' 
       OR job_status = 'C2' 
       OR job_status = 'C8') 
GROUP BY Year(job_completed_date), 
      Month(job_completed_date) 
ORDER BY job_completed_date ASC 
+0

Sie haben das% alter verpasst – Acewin

0

Zur Vereinfachung Ich beziehe mich auf Ihre Fragen als QUERY_ONE und QUERY_TWO, werden Sie natürlich diese Verweise mit dem eigentlichen ersetzen müssen Abfragen.

SELECT a.Year, a.Month, a.Completed_On_Schedule, b.Total_Completed, 
((a.Completed_On_Schedule/b.Total_Completed) * 100) AS `%_On_Schedule` 
FROM (QUERY_ONE) AS a JOIN (QUERY_TWO) AS b ON a.Year = b.Year AND a.Month = b.Month; 

Diese Abfrage wird Ihre zwei Tabellen auf Zeilen passend auf Jahr und Monat beitreten, dann aus jeder Tabelle die gewünschten Werte extrahieren und Ihre Prozent auf Zeitplan Spalte erstellen.Sie müssen Ticks auf Ihren% _On_Schedule-Namen anwenden, da% ein Schlüsselwort in MySQL ist. Ich würde empfehlen, dieses Symbol aus diesem Grund nicht zu verwenden, aber es ist wirklich keine große Sache.

+0

Stellen Sie sicher, dass Sie mit '100.0 'multiplizieren, sonst erhalten Sie eine Ganzzahl-Division. –

+0

Ah richtig, um Prozent und nicht Dezimal zu bekommen, danke, dass Sie das fangen. – yanman1234

Verwandte Themen