SQL基礎:顯示不存在的分組數量為0


某天遇到這樣一個問題:

本公司有報表需要展示區域“alpha”的前一日所有店鋪銷量,示例如下:
店鋪 昨日銷量
store1 124
store2 532
store3 325
store4 665
 
某天由於“store3”停業,當日“store3”在store_table表中沒有數據。
當第二天需要出昨日報表數據時。
報表原本預想展示的數據如下:
店鋪 昨日銷量
store1 168
store2 480
store3 0
store4 720
 
但是當日報表實際展示為:
店鋪 昨日銷量
store1 168
store2 480
store4 720
那么如何解答?

在說到題目中的問題之前,我們來回顧一下SQL基礎知識。

在一般的SQL語句中,SQL的執行順序如下圖所示。

 

 具體來說,就是:FROM—> WHERE—> GROUP BY—>HAVING—> SELECT—>ORDER BY—>LIMIT/OFFSET

解答題目中的問題,我們還需要了解Join的7種理論基礎,鑒於篇幅,直接貼圖。

 

 從上圖可以看出,需要連接的表如果需要過濾空值,則需要增加 XXX is null的關聯條件,而本題目中恰恰相反,需要需要將為空的顯示出來。

下面看看我的解題思路:

首先創建2張表,地區表和銷售表。

use mydb;
create table area_table
(
    store_id varchar(10) PRIMARY KEY,
		area varchar(20),		
		 leader_id int
);

create table store_table
(
    store_id varchar(10) ,
    order_id varchar(12)  PRIMARY KEY,
    sales_volume int,
    salesdate date
); 

插入部分業務數據,此處省略。

題目中需要統計昨天所有alpha地區中的所有店鋪的銷售情況。(包括店鋪3的未營業數量0。)

由於需要增加空值並顯示結果為0,需要在關聯的時候增加分空的處理方法,具體SQL如下:

SELECT
    a.store_id,
    IFNULL( sum( sales_volume ), 0 ) AS sales_volumes 
FROM
    area_table a
    LEFT JOIN store_table b ON a.store_id = IFNULL( b.store_id, a.store_id ) 
    AND b.salesdate = DATE_SUB( curdate( ), INTERVAL 1 DAY ) 
WHERE
    a.area = 'alpha' 
GROUP BY
    a.store_id 
ORDER BY
    a.store_id;
注: DATE_SUB(curdate(),INTERVAL 1 DAY) 該函數意為:求出昨天的日期;
實現過程:
1.使用curdate()求出當天日期;
2.使用DATE_SUB(當天日期,INTERVAL 1 DAY)實現當天日期減一天的日期,即昨日日期;
3.用IFNULL函數處理空數據的情況;
4.LEFT JOIN的時候關聯處理,如果為空ID,顯示主表ID
 
執行出來結果如下:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM