2017-08-09 11 views
0

私はMYSQLにはかなり新しく、クエリを完了するのに援助が必要です。同じテーブルで2つのクエリを結合し、結果に列を追加してください

私は、私がPHPで使うことができるただ1つのクエリに必要な2つの別々のクエリを持っています。

次のSQLを使用して、Job_SLA_Due_Date以下のJob_Completed_Dateを持つ 'import'という表のレコード数を取得しています。

私のwhere句は、 'import'テーブルで過去6か月間に完了したジョブをチェックします。

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 

結果出力が細かく、以下を生成します....

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

私の2番目のクエリが同じテーブルを使用して似ていますが、私が完了したジョブの合計数を探しています私はJob_SLA_Due_Dateについて心配していません。私が使っているSQLが.......

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 

で結果出力は、私が今必要なもの.....

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

予想通りであり、次を生成し、このように出力されます私は一緒に私の2つのクエリに参加し、Completed_On_Schedul割合、すなわち、スケジュール通りに完了したジョブの割合である%の_Completed_On_Scheduleと呼ばれる別の列を追加する必要が一言で言えばそう......

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 

e列はTotal_Completed列の列です。

本当にありがとうございます。

よろしく

アラン

答えて

1

ちょうどあなたのSELECT上の条件付きCOUNTを使用しています。答えのために

Aditional先端使用INの代わりに、複数の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 

あなたはここで一緒に2つのクエリを結合する方法(この場合のためにそれを必要としない場合でも)の例である:

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

スケジュールカウントを完了するためにcountの代わりにsumを使用することもできます。 – Acewin

+0

@Acewin私は、このケースが必要でないときでも、OPが求めるものであり、別の状況で彼にとって役に立つかもしれないので、 'JOIN'バージョンを追加します。私はカウントするために 'SUM(1/0)'を使うのは好きではありません。あなたが 'COUNT()'を使用している場合は、 –

+0

私は実現しました。なぜ私は私のコメントを更新したのですか? – Acewin

0

私はあなたの質問に合計とCASE句を含む列を追加しました。私たちは、私がQUERY_ONEQUERY_TWOとしてあなたのクエリを参照しています。簡単のため

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

あなたは%年齢を逃しました – Acewin

0

CASE_でそれを持っているので、また、私はあなたが、もちろん実際の持つこれらの参照を置き換える必要があります、削除され、SLAのためにしていますクエリ。

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; 

このクエリは、各テーブルから所望の値を抽出し、スケジュール欄にあなたのパーセントを作成し、年と月に一致する行にあなたの2つのテーブルを結合します。あなたは%_On_Scheduleという名前にティックを適用する必要があります。なぜなら%はMySQLの重要な用語なので、この理由でこのシンボルを使用しないことをお勧めしますが、それは本当に大きな問題ではありません。

+0

必ず '100.0'を掛けてください。さもなければ整数除算が得られます。 –

+0

ああ、小数点ではなく百分率を得る権利。それを捕まえてくれてありがとう。 – yanman1234

関連する問題