Re: [考題] 102關務三等 資訊處理 資料庫應用SQL查詢

看板Examination作者 (開弓)時間12年前 (2013/06/04 09:36), 編輯推噓4(4010)
留言14則, 5人參與, 最新討論串2/3 (看更多)
※ 引述《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 │ └──────┴─────┴────┘ 應該是這樣...吧? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.111.51.2 ※ 編輯: ARCHERDEVIL 來自: 175.111.51.2 (06/04 09:57)

06/04 10:05, , 1F
正確無誤!!
06/04 10:05, 1F

06/04 10:06, , 2F
這個時候就要回「嗯嗯,跟我想的一樣」
06/04 10:06, 2F

06/04 10:46, , 3F
但實際上如果是sql server應該會多顯示群組名稱
06/04 10:46, 3F

06/04 22:20, , 4F
非常感謝ARCHERDEVIL詳細解釋,原來我是錯在分群之後的觀念
06/04 22:20, 4F

06/04 22:39, , 5F
其實我覺得你應該是SQL敘述語句執行順序弄錯
06/04 22:39, 5F

06/04 22:40, , 6F
一般來說,SQL語句最先執行from
06/04 22:40, 6F

06/04 22:40, , 7F
然後是where,再來應該是group by, 接著having
06/04 22:40, 7F

06/04 22:41, , 8F
然後select,最後order
06/04 22:41, 8F

06/04 22:42, , 9F
這就是為什麼我一開始要把整句敘述拆成數行的原因
06/04 22:42, 9F

06/04 22:42, , 10F
對我來說這樣比較好判斷順序XD
06/04 22:42, 10F

06/04 22:42, , 11F
建議你也可以試看看...
06/04 22:42, 11F

06/05 22:28, , 12F
分成數行後的確比較清楚,謝謝您的教導
06/05 22:28, 12F

06/05 22:53, , 13F
您言重了阿~討論一下而已: )
06/05 22:53, 13F

07/26 20:19, , 14F
受教推
07/26 20:19, 14F
文章代碼(AID): #1HhKIBI5 (Examination)
討論串 (同標題文章)
文章代碼(AID): #1HhKIBI5 (Examination)