SQL Database Management Part 8

1. Having... 

範例一:

Select Datepart(m, 日期), 客戶名稱, SUM(數量)
From 書籍訂單
Group By 客戶名稱, Datepart(m, 日期)
Having Datepart(m, 日期) = 4

範例二:
Select Datepart(m, 日期), 客戶名稱, SUM(數量)
From 書籍訂單
Group By 客戶名稱, Datepart(m, 日期)
Having SUM(數量) >= 100

範例三:
Select 客戶名稱, COUNT(*) From
書籍訂單 Group By 客戶名稱
Having COUNT(*) < 5
Order By COUNT(*) ASC

範例四:
-- 以下是錯誤的
Select Datepart(m, 日期), 客戶名稱, SUM(數量)
From 書籍訂單
Where SUM(數量) >= 100
Group By 客戶名稱, Datepart(m, 日期)


範例四要改成:

Select Datepart(m, 日期), 客戶名稱, SUM(數量)
From 書籍訂單
Group By 客戶名稱, Datepart(m, 日期)

Having SUM(數量) >= 100


2. Join 

a. inner join

說明:在 select 語句裡,必須指名 "dbo.訂單.客戶編號"。
範例一:
Select 訂單序號, 日期, dbo.訂單.客戶編號, 客戶名稱 From 訂單

Join dbo.客戶 On dbo.訂單.客戶編號 = dbo.客戶.客戶編號

範例二:
Select 訂單序號, 日期, dbo.訂單.客戶編號 AS 訂單客戶編號,
客戶.客戶編號 AS 客戶客戶編號, 客戶名稱 From 訂單, 客戶
Where dbo.訂單.客戶編號 = dbo.客戶.客戶編號


範例一 的結果與 範例二 相同


範例三:選出 總價(單價*數量) 大於 20000 的書

b. outer join

範例一:在四月中,每家客戶皆下了幾張訂單,包含零。
第一步:從訂單資料表選出四月份有哪些客戶,並加以算出每家客戶下訂的次數

第二步:從客戶資料表中選出所有客戶

第三步:以客戶編號為基準,用 left outer join 結合第一步(為後) & 第二步(為前)。之後再加上 isNull 判斷將 NULL 的值補上零。


select c.客戶名稱, isnull(t.cc,0) as 訂單數量 from dbo.客戶 c
left outer join
(select 客戶編號 , count(*)as cc from dbo.訂單
where DATEPART (m, 日期) = 4
group by 客戶編號) t
on c.客戶編號 = t.客戶編號




範例二:有哪些訂單的數量是大於 AVG 數量

select 客戶名稱,書籍名稱,訂單序號 from dbo.書籍訂單
where 數量 >
(select  AVG(數量) from dbo.書籍訂單)
order by 客戶名稱

說明:第一步先選出AVG;第二步再選出數量大於AVG的訂單




c. 比較
 1. A in (a,b,c) :in 後面必須是一維陣列,就是單一欄位,多個數值。
 2. where A > all (a,b,c):> 後面可以跟多個數比較。 all是指括弧內所有的數,可以用 MAX 來替換。
 3. where A > any (a,b,c): any 是指括弧內的任何一個


d. 各家書店的數量佔所有總量的百分比


PS:無聊時,做了資料型態的轉換再轉換。
ㄟ....啊就是把佔有率只留小數二位。



No comments: