案例2 case when 案例分析

一、概述
    關係理論的3個支柱是選擇、投影、聯接。使用聯接可以將不同表或視圖的行相互聯繫起來。聯接支持暗示數據庫中存儲數據的方式。有幾種方法可以聯接表的,最常見的方法稱爲同等聯接,該聯接依據列值或表達式的相等性將一行與另一個表中的一行或多行關聯起來,還可以使用非同等聯接來聯接表。在這種聯接中,行與另一個表中的一行或多行關聯起來,前提是這些行的列值在由不等於運算符確定的範圍之內。

    另一種不常見的方法是將這些行與同一個表中的其他行關聯起來。這種關聯建立在列之上,
這些列相互之間有邏輯關係以及層次結構關係。這種聯接稱爲自聯接。當執行同等聯接和非同等聯接時,會排除包含空值或公共聯接列中具有不同條目的行。如果有必要的話,可以使用外聯接來獲得單行。當來自一個表的所有行聯接到另一個表的所有行時,就會形成笛卡爾乘積。這種聯接通常是
遺漏聯接條件或聯接條件不充足的結果,但有時也故意爲之。

二、聯接分類
1、同等聯接和非同等聯接
2、自聯接
3、外聯接
(1)左外聯接(2)右外聯接(3)全外聯接

以上關於具體每種聯接的含意、示例、用法在這裏不做詳細說明,更多相關知識可以查看Oracle官方文檔。

三、需求場景
看如下圖,在數據庫裏面有兩張表,產品價格表和價格範圍表,通過編寫SQL語句來實現統計報表的效果。


1、創建兩張表並插入數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
SQL> desc product_price; 
Name    Type         Nullable Default Comments 
------- ------------ -------- ------- -------- 
PRODUCT VARCHAR2(25) Y 
PRICE   NUMBER       Y 
SQL> desc extend_price; 
Name        Type   Nullable Default Comments 
----------- ------ -------- ------- -------- 
START_PRICE NUMBER Y 
END_PRICE   NUMBER Y 
SQL> select * from product_price; 
PRODUCT                        PRICE 
------------------------- ---------- 
a                                  2
b                                  3
c                                 11
d                                 11
e                                 12
f                                 35
g                                 34
h                                 23
i                                 33
j                                 66
k                                 10
11rows selected 
SQL> select * from extend_price; 
START_PRICE  END_PRICE 
----------- ---------- 
09
1019
2029
3039
4099999

2、分析
既然是要顯示成統計報表的形式內容,那麼首先得拿着product_price表的price列值與extend_price
表的start_price/end_price列進行比較才能確定在哪些區間有多少產品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQL> SELECT 
CASE 
WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '0%'
THEN '10元以下'
WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '4%'
THEN '40元以上'
ELSE b.start_price || '元到'|| b.end_price || '元'
END EXTEND_PRICE, 
SUM ( 
CASE 
WHEN a.price >= b.start_price AND a.price <= b.end_price 
THEN 1
ELSE 0
END 
) PRODUCT_COUNT 
FROM product_price a, extend_price b 
WHERE a.price >= b.start_price AND a.price <= b.end_price 
GROUP BY 
CASE 
WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '0%'
THEN '10元以下'
WHEN b.start_price || '元到'|| b.end_price || '元'LIKE '4%'
THEN '40元以上'
ELSE b.start_price || '元到'|| b.end_price || '元'
END ORDER BY 1;
1
2
3
4
5
6
7
8
EXTEND_PRICE                                                                     PRODUCT_COUNT 
-------------------------------------------------------------------------------- ------------- 
10元以下                                                                                     2
10元到19元                                                                                   4
20元到29元                                                                                   1
30元到39元                                                                                   3
40元以上                                                                                     1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章