Group by问题

来源:百度知道 编辑:UC知道 时间:2024/07/02 05:39:42
select
B.bookid as '订单编号',
C.cName as '客户',
C.address as '送货地址',
Sum(B.bookPrice*qty) as '付款总额',
O.orderDate as '订单日期',
O.sendDate as '送货日期',
B.bookNum as '货品编号',
B.bookName as '货品名称',
B.bookPrice as '单价',
D.qty as '数量',
B.bookPrice*qty as '小计'
from
Orders as O
left join Customers as C on (C.CID=O.CID)
left join Order_Details as D on (D.orderid=O.orderid)
left join Books as B on (B.bookid=D.bookid)
group by
B.bookid,C.cName,C.address,O.orderDate,O.sendDate,B.bookNum,B.bookName

group by B.bookid...后面一定要和select B.bookid...对应的吗?我觉得好麻烦啊,是不是只能这样做的啊。不要用太深的语句回复
但是select不使用SUM的话,使用group by分组时候也要和select有的B.bookid...的相对应才行啊,如果我select要查看100个,那么group by里面不是也要写100?我只是想分组一些的行吗?

你的里面用到了Sum函数 这是个聚合函数 就必须要使用到group by 那么其他非聚合函数的列都要加到group by 中去。

补充 有个折中的方法 可以不用写这么多
打个比方(你的例子太长,表太多,我自己找个简单的例子):
a表
id name
1 jim
2 kate

b
id money
1 100
1 40
2 40
2 50
我要求id name money
按照你的写法是:
select a.id,a.name,sum(b.money)
from a inner join b on a.id=b.id grop by a.id,a.name;

这样group by 后面有2个

而我的写法:
select a.id,a.name,test.total from
a inner join (select id,sum(money) as total form b group by id) test
on a.id=test.id;
你看 group by 后面就只有一个列了 是不是很方便?

为什么要用group by你肯定知道,像上面两位说的,你使用了聚合函数,如果不group by,那么聚合函数就对整个表作为一个整体产生作用了

不是select多少个属性,就要group by多少个属性的

group by B.bookid...是根据不同的B.bookid...把整个表分成一段一段的,然后用聚合函数作用在每一段上,每一段最后只返回一行

因此,如果这里的B.bookid就可以作为主键,也就是如果一个订单号就能唯一确定客户、送货地址、订单日期、送货日期、货品编号、货品名称、单价、数量,那么只要group by B.bookid就可以了;
如果对于同一个B.bookid会有超过1种的货物,那么group by B.bookid就不够,至少需要group by