2016-05-03 4 views
2

人私は2つの異なるテーブルを持っています。左外部結合とon節を使用して共通の列を持つ2つの異なるテーブルからデータを取得する

表1:

contract-id | contract-date 
    1   | 01-05-2016 
    1   | 01-06-2016 
    1   | 01-07-2016 
    2   | 01-01-2016 
    2   | 01-02-2016 
    3   | 01-05-2016 
    3   | 01-06-2016 

表2:

invoice-number|contract-id|invoice-from-date|invoice-to-date 
1   |1   |01-05-2016  |31-05-2016 
2   |1   |15-05-2016  |31-05-2016 
3   |1   |25-05-2016  |31-05-2016 

私の要件は、私はテーブル-1から現在の月に来るすべての契約が何であるかを示さなければならない、で、私はテーブル-2からそれらの契約のために調達された請求書の数を表示しなければなりません。発生した請求書があれば、その数を表示するか、単にゼロを表示する必要があります。予想される答えは:

contract-id|counts 
1   |3 
3   |0 

契約-idの数:3があるため、私の避難所「、0である:私は現在の月のための3つの請求書を調達し、契約-idの回数たので1は、3ですそれについて請求書を提出した。 contract-id:2は欠けています。なぜなら、現在の月には来ないからです。

これは私が試したものです:

select cbm_contract_period_value_split.contract_id, 
count(cbm_contract_invoice_request.contract_id), 
cbm_contract_period_value_split.contract_date 
from cbm_contract_period_value_split 
left outer join cbm_contract_invoice_request 
on cbm_contract_period_value_split.contract_id = cbm_contract_invoice_request.contract_id 
and MONTH(cbm_contract_period_value_split.contract_date) = MONTH(CURDATE()) 
and MONTH(cbm_contract_invoice_request.invoice_for_the_period_of_from_date) = MONTH(CURDATE()) 

私はすでにこの質問を掲載しましたが、今私は私が得た答えと編集されたバージョンでこれを掲示しています。しかし、私は希望の答えを得ていません。何が間違っていて、私は何をすべきですか?

+2

#3がまだ存在する場合、契約ID#2が希望の結果で消えたのはなぜですか? –

+0

これは単なる例であり、当月には存在しないため、考慮する必要はありません。 – SSS

答えて

0

これを試してください。私はGROUP BYが必要だと思うし、現在の月ではない行を除外するためにWHEREに入れます。

select pvs.contract_id, 
     count(ir.contract_id) as counts, 
     pvs.contract_date 
from cbm_contract_period_value_split as pvs 
left join cbm_contract_invoice_request as ir 
on pvs.contract_id = ir.contract_id 
and MONTH(ir.invoice_for_the_period_of_from_date) = MONTH(CURDATE()) 
WHERE MONTH(pvs.contract_date) = MONTH(CURDATE()) 
GROUP BY pvs.contract_id,pvs.contract_date 

http://sqlfiddle.com/#!9/e5f08c/9

結果

contract_id  counts contract_date 
1    3  May, 01 2016 00:00:00 
3    0  May, 01 2016 00:00:00 
0
SELECT Table-1.contract_id, Table-1.contract-date, COUNT(*) AS count FROM Table-2 LEFT JOIN Table-1 ON Table-1.contract_id = Table-2.contract_id WHERE MONTH(Table-1.contract-date) = MONTH(CURDATE()) GROUP BY Table-1.contract_id 
0

この文字列で検索してください。..

SELECT 
    t1.`contract-id`, 
    ( 
    CASE  
     WHEN t2.`contract-id` IS NULL 
     THEN 0 
     ELSE COUNT(*) 
    END 
) AS counts 
FROM 
    t1 
    LEFT JOIN t2 
    ON t1.`contract-id` = t2.`contract-id` 
WHERE MONTH(`contract-date`) = MONTH(CURDATE()) 
GROUP BY t2.`contract-id` 
ORDER BY t1.`contract-id`,`contract-date` ; 

FIDDLE

関連する問題