作者ARCHERDEVIL (开弓)
看板Examination
标题Re: [考题] 102关务三等 资讯处理 资料库应用SQL查询
时间Tue Jun 4 09:36:09 2013
※ 引述《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)
1F:推 asdd:正确无误!! 06/04 10:05
2F:推 kaitouGamer:这个时候就要回「嗯嗯,跟我想的一样」 06/04 10:06
3F:→ ARCHERDEVIL:但实际上如果是sql server应该会多显示群组名称 06/04 10:46
4F:推 khlo926:非常感谢ARCHERDEVIL详细解释,原来我是错在分群之後的观念 06/04 22:20
5F:→ ARCHERDEVIL:其实我觉得你应该是SQL叙述语句执行顺序弄错 06/04 22:39
6F:→ ARCHERDEVIL:一般来说,SQL语句最先执行from 06/04 22:40
7F:→ ARCHERDEVIL:然後是where,再来应该是group by, 接着having 06/04 22:40
8F:→ ARCHERDEVIL:然後select,最後order 06/04 22:41
9F:→ ARCHERDEVIL:这就是为什麽我一开始要把整句叙述拆成数行的原因 06/04 22:42
10F:→ ARCHERDEVIL:对我来说这样比较好判断顺序XD 06/04 22:42
11F:→ ARCHERDEVIL:建议你也可以试看看... 06/04 22:42
12F:→ khlo926:分成数行後的确比较清楚,谢谢您的教导 06/05 22:28
13F:→ ARCHERDEVIL:您言重了阿~讨论一下而已: ) 06/05 22:53
14F:推 jjalu:受教推 07/26 20:19