欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用LEFT?JOIN?統(tǒng)計左右存在的數(shù)據(jù)問題

 更新時間:2022年10月25日 09:00:47   作者:小碼code  
最近做了一個數(shù)據(jù)模塊的統(tǒng)計,統(tǒng)計企業(yè)收款、發(fā)票相關(guān)的數(shù)據(jù),開始統(tǒng)計是比較簡單,后面再拆分賬套統(tǒng)計就有點小復(fù)雜,這篇文章主要介紹了使用LEFT?JOIN?統(tǒng)計左右存在的數(shù)據(jù),需要的朋友可以參考下

最近做了一個數(shù)據(jù)模塊的統(tǒng)計,統(tǒng)計企業(yè)收款、發(fā)票相關(guān)的數(shù)據(jù),開始統(tǒng)計是比較簡單,后面再拆分賬套統(tǒng)計就有點小復(fù)雜,本文做一個簡單的記錄。

需求

企業(yè)表

企業(yè)表t_company有如下字段:標識id、企業(yè)名稱name:

idname
1騰訊
2百度

收款表

企業(yè)對應(yīng)有收款表t_collection有如下字段:標識id、賬套account、企業(yè)idcompany_id、收款金額amount

idaccountcompany_idamount
11130
22120
31230
42240

開票表

開票表t_invoice有如下字段:標識id、賬套account、企業(yè)idcompany_id、發(fā)票金額amount

idaccountcompany_idamount
11110
22120
31230
42250

匯總企業(yè)統(tǒng)計

現(xiàn)在要做一個統(tǒng)計,統(tǒng)計企業(yè)收款金額,以及發(fā)票金額,需要將收款表和發(fā)票表將company_idgroup up操作。開票表也是做類似的操作,企業(yè)表和上面的結(jié)果做left join連接操作,sql如下:

select tc.id,tc.name,tc2.amount as collection_amount,ti.amount as invoice_amunt from t_company tc 
left join (
  select company_id,sum(amount) as amount from t_collection group by company_id
) tc2 on tc.id = tc2.company_id
left join (
  select company_id,sum(amount) as amount from t_invoice group by company_id
) ti on tc.id = ti.company_id

查詢結(jié)果:

idnamecollection_amountinvoice_amunt
1騰訊5030
2百度7080

再分賬套做匯總(重點)

在上面統(tǒng)計的基礎(chǔ)上,再拆分賬套統(tǒng)計

收款表和發(fā)票表做賬套的拆分,和企業(yè)表做關(guān)聯(lián):

select tc.id,tc.name,tc2.amount as collection_amount,ti.amount as invoice_amunt from t_company tc 
left join (
  select company_id,account,sum(amount) as amount from t_collection 
  group by company_id,account
) tc2 on tc.id = tc2.company_id
left join (
  select company_id,account,sum(amount) as amount from t_invoice 
  group by company_id,account
) ti on tc.id = ti.company_id and tc2.account = ti.account

首先是將收款表做賬套的拆分,然后關(guān)聯(lián)發(fā)票表的賬套拆分??此茮]有問題,但是left join返回左邊的所有記錄,以及右邊字段相等的數(shù)據(jù)。

這樣就有一個問題:

如果左邊表沒有的數(shù)據(jù),右邊的表也不會查出來。比如以上查詢收款表不存在的賬套,發(fā)票表存在賬套也不會查出來。這就是left join的局限性。

全表連接解決方案一:

MySQLleft joinright join應(yīng)該也有full join全表連接。

但是MySQL是不支持full join全表連接。

網(wǎng)上也有解決方案使用union替換full_join,思路是左表左連接右邊,左表右連接右邊,將上面的兩個結(jié)果union連接起來:

select * from t1 left join t2 on t1.id = t2.id
union 
select * from t1 right join t2 on t1.id = t2.id;

上面只是兩個表的關(guān)聯(lián),如果三個表或者更多的關(guān)聯(lián),寫起來就比較繁瑣了。

全表連接解決方案二:

全表連接就是一個沒有限制的左表連接,就是去掉on關(guān)聯(lián)條件,

left join所有的賬套,首先要顯示全所有的賬套,企業(yè)表關(guān)聯(lián)賬套表,但是兩個表是沒有關(guān)聯(lián)的,需要去掉on后面的關(guān)聯(lián)條件,但是MySQL語法連接后面必須要加on,將約束條件改成1 = 1即可:

 select tc.id,tc.name,ta.id as account from t_company tc left join t_account ta on 1 = 1
idnameaccount
1騰訊1
1騰訊2
2百度1
2百度2

查詢出所有的公司賬套之后,再left join收款表和發(fā)票表:

select tc.id,tc.name,tc.account,tc2.amount as collection_amount,ti.amount as invoice_amunt from (
select tc.id,tc.name,ta.id as account from t_company tc left join t_account ta on 1 = 1
)tc
left join (
  select company_id,account,sum(amount) as amount from t_collection group by company_id,account
) tc2 on tc.id = tc2.company_id and tc.account = tc2.account
left join (
  select company_id,account,sum(amount) as amount from t_invoice group by company_id,account
) ti on tc.id = ti.company_id and tc.account = ti.account

結(jié)果:

idnameaccountcollection_amountinvoice_amunt
1騰訊13010
1騰訊22020
2百度13030
2百度24050

總結(jié)

  • 企業(yè)分組統(tǒng)計收款和發(fā)票表,只需要對企業(yè)做group by分組即可。
  • 企業(yè)和賬套一起分組,left join只會統(tǒng)計左邊存在的數(shù)據(jù),而需要統(tǒng)計兩邊都存在的數(shù)據(jù)。
    • 使用union多表查詢比較繁瑣。
    • left join使用on 1 = 1查詢不添加限制條件,查詢所有公司的賬套,再關(guān)聯(lián)發(fā)票和收款。

參考

到此這篇關(guān)于使用LEFT JOIN 統(tǒng)計左右存在的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)left join左右存在的數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql數(shù)據(jù)庫存儲過程之游標(光標cursor)詳解

    mysql數(shù)據(jù)庫存儲過程之游標(光標cursor)詳解

    這篇文章主要介紹了mysql數(shù)據(jù)庫存儲過程之游標(光標cursor)詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL執(zhí)行外部sql腳本文件的命令

    MySQL執(zhí)行外部sql腳本文件的命令

    sql腳本是包含一到多個sql命令的sql語句,我們可以將這些sql腳本放在一個文本文件中,然后通過相關(guān)的命令執(zhí)行這個sql腳本文件,本文就詳細的介紹一下,感興趣的朋友可以了解一下
    2021-12-12
  • MySQL創(chuàng)建內(nèi)部臨時表的所有場景盤點

    MySQL創(chuàng)建內(nèi)部臨時表的所有場景盤點

    這篇文章主要為大家介紹了MySQL創(chuàng)建內(nèi)部臨時表的所有場景盤點,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 淺談Mysql指定順序排序查詢

    淺談Mysql指定順序排序查詢

    給大家用過實例分析了Mysql查詢中指定順序排序的相關(guān)技術(shù)問題,需要的朋友參考一下吧。
    2017-12-12
  • 如何解決MYSQL8.4.1 MySQL84--ERROR 1524(HY000):Plugin ‘msql_native_password‘ is not loaded問題

    如何解決MYSQL8.4.1 MySQL84--ERROR 1524(HY000):Plugin&n

    這篇文章主要介紹了如何解決MYSQL8.4.1 MySQL84--ERROR 1524(HY000):Plugin ‘msql_native_password‘ is not loaded問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • MySQL GRANT用戶授權(quán)的實現(xiàn)

    MySQL GRANT用戶授權(quán)的實現(xiàn)

    授權(quán)就是為某個用戶賦予某些權(quán)限。MySQL 提供了 GRANT 語句來為用戶設(shè)置權(quán)限。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • SQL中表鎖定(LOCK、UNLOCK)的具體使用

    SQL中表鎖定(LOCK、UNLOCK)的具體使用

    本文主要介紹了SQL中表鎖定(LOCK、UNLOCK)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • mysql 10w級別的mysql數(shù)據(jù)插入

    mysql 10w級別的mysql數(shù)據(jù)插入

    幾天前做了一個短信發(fā)送東東,一次性要插入10w以上的手機號碼。我的個天啊。
    2011-08-08
  • mysql "too many connections" 錯誤 之 mysql解決方法

    mysql "too many connections" 錯誤 之 mysql解決方法

    解決方法是修改/etc/mysql/my.cnf,添加以下一行
    2009-06-06
  • MySql數(shù)據(jù)庫單表查詢與多表連接查詢效率對比

    MySql數(shù)據(jù)庫單表查詢與多表連接查詢效率對比

    在遇到數(shù)據(jù)之間的聯(lián)系很復(fù)雜,建表就很糾結(jié),到底該怎么去處理這些復(fù)雜的數(shù)據(jù)呢,是單表查詢,然后在業(yè)務(wù)層去處理數(shù)據(jù)間的關(guān)系,還是直接通過多表連接查詢來處理數(shù)據(jù)關(guān)系呢
    2021-09-09

最新評論