簡體   English   中英

使用左外部聯接和on子句從具有公共列的兩個不同表中檢索數據

[英]Retrieving data from two different tables with common column using left outer join and on clause

伙計們,我有兩個不同的桌子。

表格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

合同編號:1的計數為3,因為我當月已開了3張發票,合同編號:3的計數為0,因為我沒有為此開任何發票。 而且缺少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())

我已經發布了這個問題,但是現在我將其發布為帶有我得到的答案的編輯版本。 但是,我沒有得到想要的答案。 怎么了,我該怎么辦?

試試這個。 我認為您需要一個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
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

試試這個查詢..

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` ;

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM