2016-10-26 11 views
1

私はview_uncollectedという名前のビューを持っています。1月から7月までの月に失われた月の検索方法

私は1月から欠落しているか何ヶ月見つける必要があり
|RemitNo|ID|Employer| AP_From | AP_To |Amount| 
| 1 |1 | a |2016-01-01|2016-01-31|200.00| 
| 2 |1 | a |2016-02-01|2016-02-29|200.00| 
| 3 |1 | a |2016-03-01|2016-03-31|200.00| 
| 4 |1 | a |2016-04-01|2016-05-31|400.00| 
| 5 |1 | a |2016-06-01|2016-06-30|200.00| 
| 6 |2 | b |2016-01-01|2016-03-31|600.00| 
| 7 |2 | b |2016-04-01|2016-04-30|200.00| 
| 8 |2 | b |2016-05-01|2016-05-31|200.00| 
| 9 |3 | c |2016-01-01|2016-01-31|200.00| 
| 10 |3 | c |2016-01-01|2016-01-31|200.00| 
| 11 |3 | c |2016-03-01|2016-03-31|200.00| 

- テーブルに基づいて、2016年

の7月上記のいくつかの複雑なケースがあります。

  • から支払われる雇用者(A) 1月〜2016年6月のみ。 1ヶ月が欠落しています。
  • 雇用者(b)は、1月から2016年5月までの払いのみです。 2ヶ月が欠落しています。
  • 雇用者(c)は1月(2x)および3月に支払った。 5ヶ月が欠落しています。 2月の1月の他の支払いは考慮しません。

各雇用者からの月間をどのように計算できますか?

私はそれぞれONE ROW = ONE MONTHと思っていたので、これは7 - COUNT(RemitNo) GROUP BY IDを使用しています。私の結果を見直した後、RemitNo = 4のように、ONE ROW = 2 MONTHSの雇用者がいます。私は間違っていたことを知っていました。なぜなら、それは月の数ではなく行の数を数えるだけだからです。

この背後にある理由は、我々が提案やコメントをありがとう1月から2016年

の7月に未回収であるどのくらいの送金知っておく必要があるということです。この初心者の質問に申し訳ありません

+0

オンラインのチュートリアルがたくさんある場合は、Googleのカレンダーテーブルが必要です – HoneyBadger

+0

http://stackoverflow.com/questions/30090379/add-missing-month-into-query-result – mhmd

+0

同じ金額で数ヶ月は1ヶ月を超えてはならないはずですか? –

答えて

1

これは基本的なクエリで、すでに支払った月を得ることができます。

SELECT ID, month 
FROM YourTable T 
JOIN ( 
     SELECT 'JAN' as month,'2016-01-01' as start,'2016-01-31' as end UNION ALL 
     SELECT 'FEB' as month,'2016-02-01' as start,'2016-02-29' as end UNION ALL 
     SELECT 'MAR' as month,'2016-03-01' as start,'2016-03-31' as end UNION ALL 
     SELECT 'APR' as month,'2016-04-01' as start,'2016-04-30' as end UNION ALL 
     SELECT 'MAY' as month,'2016-05-01' as start,'2016-05-31' as end UNION ALL 
     SELECT 'JUN' as month,'2016-06-01' as start,'2016-06-30' as end UNION ALL 
     SELECT 'JUL' as month,'2016-07-01' as start,'2016-07-31' as end 
    ) M 
    ON T.AP_From <= M.end 
    AND T.AP_To >= M.start; 

DEMO部分的な結果:

enter image description here

最終クエリ:

SELECT ID, COUNT(month) as payed 
FROM 
    (
     <First Query> 
    ) F 
GROUP BY ID; 

OUTPUT約2つの日付とSUMすべての行の間differnceを計算する方法

enter image description here

+0

SIRは、月としてSELECT 'MAY'、開始として '2016-05-01'、最後に '2016-05-31' UNION ALL'が欠落していますか? – Clorae

+0

あなたは正しいです。 –

+0

先生、「RemitNo 4」の私の例はどうですか?2016-04-01 - 2016-05-31からです。それは4月から5月です。 – Clorae

0

SELECT Employer, 7-SUM(TIMESTAMPDIFF(MONTH, AP_from, DATE_ADD(AP_to,INTERVAL 1 DAY))) as missingmonth 
FROM tablename 
GROUP BY Employer; 
0

は、私は私が私を呼んでいる、単純な整数列を、使用しています。この例の目的のために

SELECT * FROM my_table; 
+---+ 
| i | 
+---+ 
| 2 | 
| 3 | 
| 5 | 
| 8 | 
+---+ 

SELECT 7 - COUNT(DISTINCT i) x FROM my_table WHERE i BETWEEN 1 AND 7; 
+---+ 
| x | 
+---+ 
| 4 | 
+---+ 

...次の点を考慮して、それは同じように簡単かもしれませんデート。他の人は、カレンダーやユーティリティテーブルが必要だと示唆しています。私はあなたがしていないことを実証しています。私は、存在するはずの数から見つかった(別個の)月/整数の数を単に差し引いています。テーブルに基づいて

+0

'i'は何を意味していますか? – Clorae

+0

この例では、単純な整数列を使用していますが、これはiと呼ばれていますが、簡単に日付にすることもできます。他の人は、カレンダーやユーティリティテーブルが必要だと示唆しています。私はあなたがしていないことを実証しています。私は、存在するはずの数から見つかった(別個の)月/整数の数を単に差し引いています。 – Strawberry

0
|RemitNo|ID|Employer| AP_From | AP_To |Amount| 
| 1 |1 | a |2016-01-01|2016-01-31|200.00| 
| 2 |1 | a |2016-02-01|2016-02-29|200.00| 
| 3 |1 | a |2016-03-01|2016-03-31|200.00| 
| 4 |1 | a |2016-04-01|2016-05-31|400.00| 
| 5 |1 | a |2016-06-01|2016-06-30|200.00| 
| 6 |2 | b |2016-01-01|2016-03-31|600.00| 
| 7 |2 | b |2016-04-01|2016-04-30|200.00| 
| 8 |2 | b |2016-05-01|2016-05-31|200.00| 
| 9 |3 | c |2016-01-01|2016-01-31|200.00| 
| 10 |3 | c |2016-01-01|2016-01-31|200.00| 
| 11 |3 | c |2016-03-01|2016-03-31|200.00| 

は、上記のいくつかの複雑なケースがあります:1月から支払わ

  • 雇用(A) - 2016年6月ONLY。 1月に が見つかりません。
  • 雇用者(b)は、1月から2016年5月までの払いのみです。 2ヶ月は です。
  • 雇用者(c)は1月(2x)および3月に支払った。 5月は です。 1月のその他のお支払いは、 2月とはみなされません。

さて、私はそれを参照してください方法は、雇用2016-06-302016-01-01からフルに起因する金額を支払い、June月の彼の支払いがRemitNo 4に行われたこと。私たちは雇用者によってグループ化された総和を選択した場合、我々はそれぞれの雇用主は月額200を支払う必要があり、蓄積される月数は2016-01-01から6ヶ月であると仮定した場合、我々は今

|Employer|Sum | 
| a |1200.00| 
| b |1000.00| 
| c | 600.00| 

になるだろう2016-06-30にすると、最も論理的なクエリになります。

SELECT employer, (200 * 6) - sum(amount) as balance, sum(amount)/200 as months_due FROM table WHERE AP_FROM => '2016-01-01' AND AP_To <= '2016-06-30' HAVING (200 * 6) - sum(amount) > 0;

私は、スクリプトをテストしていませんが、私はこれはかなり何が必要であると考えています。

編集: これは既に解決されていると思われますが、答えは正しいとは言えません。 :]

関連する問題