2017-11-20 6 views
2

私は前年の作業メンバーを取得し、前年の従業員を救済し、前の月をリストから除外して結果セットから差し引いています。今月に新しく追加されたメンバーを追加しました。MySQL:アクティブメンバーを月間で取得する方法

SQL Fiddle Link 私は現在のクエリに対して多くの改善が施されていると感じています。しかし、今私はアイデアがありません、誰かが親切にこれを助けることができますか?

SELECT * FROM employee WHERE hired_date<= CURRENT_DATE; 

その後緩和日付使って、将来的にまだある従業員のリストを取得する:私はあなたが何をする必要があるかと思います

+0

あなたは何を意味するか:: '年 に月ごとのアクティブメンバーを取得する方法'私はあなたが達成しようとしているかを把握することはできません?これはまた、ケースの発現に影響を与え、助けるかもしれません。 – cdaiga

+1

@cdaiga私たちは、1つのテーブルが従業員と雇用の日付の詳細で構成され、他のテーブルは従業員の分離日からなる2つのテーブルを持っています。私の悪い英語のために申し訳ありません – vvr02

+0

サンプルデータを提供してください(それぞれの表について)[最小完全な実例(MCVE)の提供](https://stackoverflow.com/help/mcve) と[なぜ私はMCVE](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql -query) –

答えて

2

私が正しくあなたの既存のクエリを解釈している場合は、私は次のことをお勧め:

select 
     mnth.num, count(*) 
from (
    select 1 AS num 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 union all select 10 union all select 11 union all select 12 
    ) mnth 
left join ( 
     select 
      e.emp_id 
      , case 
       when e.hired_date < date_format(current_date(), '%Y-01-01') then 1 
       else month(e.hired_date) 
       end AS start_month 
      , case 
       when es.relieving_date < date_format(current_date(), '%Y-01-01') then 0 
       when es.relieving_date >= date_format(current_date(), '%Y-01-01') then month(es.relieving_date) 
       else month(current_date()) 
       end AS end_month 
     from employee e 
     left join employee_separation es on e.emp_id = es.emp_id 
    ) emp on mnth.num between emp.start_month and emp.end_month 
where mnth.num <= month(current_date()) 
group by 
     mnth.num 
; 

これは、2017年11月21日

| num | count(*) | 
|-----|----------| 
| 1 |  6 | 
| 2 |  7 | 
| 3 |  8 | 
| 4 |  9 | 
| 5 |  10 | 
| 6 |  9 | 
| 7 |  10 | 
| 8 |  11 | 
| 9 |  12 | 
| 10 |  13 | 
| 11 |  14 | 

DEMO

に次のような結果(CURRENT_DATE()を生産

データボリュームに応じて、empサブクエリにwhere句を追加します

  , case 
       when es.relieving_date >= date_format(current_date(), '%Y-01-01') then month(es.relieving_date) 
       else month(current_date()) 
       end AS end_month 
     from employee e 
     left join employee_separation es on e.emp_id = es.emp_id 
     where es.relieving_date >= date_format(current_date(), '%Y-01-01') 
+0

私は時間をかけずにチェックしてくれてありがとうございました。私は単純化してパフォーマンスを改善しようと考えています。 – vvr02

+0

それ以外の点で改善が期待されましたが、私はそれを示唆しませんでした。速度の違いは何ですか? (事実がその単語よりも有用です)where節、あるいはその両方で試しましたか? –

+0

小規模のデータマイニングでは、リアルタイムでクエリが鉱山に比べて高速です。貴重な時間をいただきありがとうございます。 – vvr02

0

はすでにと従業員テーブルから作業しているすべての従業員が得ることです:

SELECT * FROM employee_separation WHERE relieving_date > CURRENT_DATE; 

すると、以下のように追体験日の月と年によって二つの結果とグループに参加:

SELECT DATE_FORMAT(B.relieving_date, "%Y-%M") RELIEVING_DATE, COUNT(*) 
NUMBER_OF_ACTIVE_MEMBERS FROM 
(SELECT * FROM employee WHERE hired_date <= CURRENT_DATE) A INNER JOIN 
(SELECT * FROM employee_separation WHERE relieving_date > CURRENT_DATE) B 
ON A.emp_id=B.emp_id 
GROUP BY DATE_FORMAT(B.relieving_date , "%Y-%M"); 

ここでは、SQLフィドルのDemoです。

+0

お手数をおかけしていただきありがとうございます。指定されたクエリで不運、テーブル名を小文字に変更してクエリを更新し、結果が表示されないsql fiddleで実行しました。 SELECT * FROM (*従業員WHERE hired_date <= CURRENT_DATE)からINNER JOIN(SELECT * FROM employee_separation WHERE relieving_date> CURRENT_DATE)からのCOUNT(*)NUMBER_OF_ACTIVE_MEMBERSからのBERRING_DATE、 a.emp_id = b.emp_id GROUP BY DATE_FORMAT(b。relieving_date、 "%Y-%M"); – vvr02

+0

あなたはSQLのフィドルへのリンクを共有できますか? – cdaiga

+0

http://sqlfiddle.com/#!9/e1432fa/1 – vvr02

関連する問題