102關務三等 資訊處理 資料庫應用SQL查詢 - 考試

Table of Contents

※ 引述《khlo926 (深白色)》之銘言:
: 題目如下:
: 四、(二)Select Count(*) As SKU_Count, Sum(Price) As TotalRev, SKU From
: Order_Item Group By SKU Having Sum(Price)=50;
: Order_Item
: ┌──────┬─────┬────┬───┬───────┐
: │OrderNumber │ SKU │Quantity│Price │ExtendedPrice │
: ├──────┼─────┼────┼───┼───────┤
: │ 1000 │ 201000 │ 1 │ 300 │ 300 │
: ├──────┼─────┼────┼───┼───────┤
: │ 1000 │ 202000 │ 1 │ 130 │ 130 │
: ├──────┼─────┼────┼───┼───────┤
: │ 2000 │ 101100 │ 4 │ 50 │ 200 │
: ├──────┼─────┼────┼───┼───────┤
: │ 2000 │ 101200 │ 2 │ 50 │ 100 │
: └──────┴─────┴────┴───┴───────┘
: 想法:
: Group By SKU,應該會分成4群(筆),但後面的Having Sum(Price)就看不懂了
: 印象中Having語法是針對Group By後的結果再下條件
: 但Group By後的4筆,每一筆都有各自的單一Price,
: 所以不知道Sum(Price)是要跟誰加總(或是執行之後的結果是?)
修改1:

我看了一下,你也許卡在這裡

基本上群組指令group by 會做列資料群組
也就是說如果我指定SKU作為分群標的,那就是四群資料
如果我指定OrderNumber那就是兩群資料

每一群資料都可以視為「一個完整的暫時表格」
因為關聯資料庫運算結果也應該是關聯式資料庫

所以最後加總的部份就只有以各暫時資料表格作為範圍
用程式跑就是
int x=0;
for(int i=0; i<n; i++)
{ x= x + table[i]; }
return x; //應該是這樣寫沒錯吧?

假設n=1 //只有一列資料
那該迴圈就只會運行一次
然後傳回結果




: 還請版上高手幫忙,謝謝!
: ==========================================
: 謝謝ARCHERDEVIL的提點,我的答案如下圖,請問正確嗎?謝謝!
: ┌──────┬─────┬────┐
: │SKU_Count │ TotalRev │ SKU │
: ├──────┼─────┼────┤
: │ 2 │ 100 │ 101100 │
: ├──────┼─────┼────┤
: │ 2 │ 100 │ 101200 │
: └──────┴─────┴────┘
我想應該不正確XD

我把敘述重寫一次你可能會比較清楚

Select Count(*) As SKU_Count, Sum(Price) As TotalRev, SKU
From Order_Item
Group By SKU
Having Sum(Price)=50;

從這樣看

原始表格會先變成四個群組列資料
分別是SKU=201000, SKU=202000, SKU=101100, 以及SKU=101200

然後去找各群組中price總和等於50的群組資料
於是SKU=101100 與 SKU=101200 所在群組被選出來

最後執行select 敘述

首先各群組分別計算有多少列資料,也就是count(*)
依照你提供的原始表格,兩個群組的count(*)都是1

然後計算群組內列資料中price欄位總和
因為條件式having sum(price)=50
所以總和一定是50
<>50 的不符合條件, 傳回false 因此不顯示

最後再把SKU資料列出來

換句話說...

答案應該是


┌──────┬─────┬────┐
│SKU_Count │ TotalRev │ SKU │
├──────┼─────┼────┤
│ 1 │ 50 │ 101100 │
├──────┼─────┼────┤
│ 1 │ 50 │ 101200 │
└──────┴─────┴────┘

應該是這樣...吧?


--

All Comments

Iris avatarIris2013-06-06
正確無誤!!
Daniel avatarDaniel2013-06-08
這個時候就要回「嗯嗯,跟我想的一樣」
Callum avatarCallum2013-06-11
但實際上如果是sql server應該會多顯示群組名稱
Madame avatarMadame2013-06-14
非常感謝ARCHERDEVIL詳細解釋,原來我是錯在分群之後的觀念
Irma avatarIrma2013-06-16
其實我覺得你應該是SQL敘述語句執行順序弄錯
Emily avatarEmily2013-06-16
一般來說,SQL語句最先執行from
然後是where,再來應該是group by, 接著having
William avatarWilliam2013-06-17
然後select,最後order
Ursula avatarUrsula2013-06-22
這就是為什麼我一開始要把整句敘述拆成數行的原因
對我來說這樣比較好判斷順序XD
建議你也可以試看看...
Zanna avatarZanna2013-06-26
分成數行後的確比較清楚,謝謝您的教導
Frederic avatarFrederic2013-06-28
您言重了阿~討論一下而已: )
Dorothy avatarDorothy2013-07-03
受教推