当前位置: 代码迷 >> Oracle开发 >> 请问 - 对于group by和count(*)的语句请问
  详细解决方案

请问 - 对于group by和count(*)的语句请问

热度:111   发布时间:2016-04-24 06:26:09.0
请教 -- 对于group by和count(*)的语句请教
你好,

我是使用两个表(销售表,优惠券表 来获取如下字段的值,但是对group by和count(*)的使用不是很熟悉,所以想问,如下语句有什么问题,请大家指教.

select b.p15_promo_id,  -- 促销分类
a.p23_id_i,          --  购买商品的顾客号
b.p15_coupon_no,  --优惠券号码 
b.p15_cond_rate,  -- 优惠券打折率
b.p15_cond_amt,  -- 优惠券打折金额
b.p15_expire_dt,  -- 优惠券截止日期
b.p15_create_dt, -- 优惠券创建日期
a.p23_acode,  -- 商店带啊
a.p23_jundate,  -- 销售日期
a.p23_before_amt,  -- 打折前金额
a.p23_after_amt, -- 打折后最终销售金额
a.p23_amount  -- 打折金额
count(*) as qty,  -- 使用优惠券购买商品的数量

from pos23_pm a,pos_p15 b  
where a.p23_promo_id = b.p15_promo_id
and a.p23_promo_id='PM002976'
and a.p23_coupon_no is not null
group by 
b.p15_coupon_no;

------解决思路----------------------
语句是错误的
group by 子句是对查询结果进行分组统计,
如果查询列表中包含列、表达式和分组函数,那么这些列和表达式都要出现在group by 子句中。
以上语句改为:

select b.p15_promo_id,  -- 促销分类
a.p23_id_i,          --  购买商品的顾客号
b.p15_coupon_no,  --优惠券号码 
b.p15_cond_rate,  -- 优惠券打折率
b.p15_cond_amt,  -- 优惠券打折金额
b.p15_expire_dt,  -- 优惠券截止日期
b.p15_create_dt, -- 优惠券创建日期
a.p23_acode,  -- 商店带啊
a.p23_jundate,  -- 销售日期
a.p23_before_amt,  -- 打折前金额
a.p23_after_amt, -- 打折后最终销售金额
a.p23_amount  -- 打折金额
count(*) as qty,  -- 使用优惠券购买商品的数量

from pos23_pm a,pos_p15 b  
where a.p23_promo_id = b.p15_promo_id
and a.p23_promo_id='PM002976'
and a.p23_coupon_no is not null
group by 
b.p15_promo_id,  -- 促销分类
a.p23_id_i,          --  购买商品的顾客号
b.p15_coupon_no,  --优惠券号码 
b.p15_cond_rate,  -- 优惠券打折率
b.p15_cond_amt,  -- 优惠券打折金额
b.p15_expire_dt,  -- 优惠券截止日期
b.p15_create_dt, -- 优惠券创建日期
a.p23_acode,  -- 商店带啊
a.p23_jundate,  -- 销售日期
a.p23_before_amt,  -- 打折前金额
a.p23_after_amt, -- 打折后最终销售金额
a.p23_amount;  -- 打折金额

这样语句不会报错了,估计也不满足你的查询条件。 

count(*) 函数:统计数量,
如select count(*)  from  A,表示查询A表宗条数,
如select name,count(*) from A group by name ,表示查询A表,按name列分组统计,相同name的总数。
------解决思路----------------------


select b.p15_promo_id,  -- 促销分类
a.p23_id_i,          --  购买商品的顾客号
b.p15_coupon_no,  --优惠券号码 
b.p15_cond_rate,  -- 优惠券打折率
b.p15_cond_amt,  -- 优惠券打折金额
b.p15_expire_dt,  -- 优惠券截止日期
b.p15_create_dt, -- 优惠券创建日期
a.p23_acode,  -- 商店带啊
a.p23_jundate,  -- 销售日期
a.p23_before_amt,  -- 打折前金额
a.p23_after_amt, -- 打折后最终销售金额
a.p23_amount , -- 打折金额
count(*) as qty  -- 使用优惠券购买商品的数量

from pos23_pm a,pos_p15 b  
where a.p23_promo_id = b.p15_promo_id
and a.p23_promo_id='PM002976'
and a.p23_coupon_no is not null
group by 
b.p15_promo_id,  -- 促销分类
a.p23_id_i,          --  购买商品的顾客号
b.p15_coupon_no,  --优惠券号码 
b.p15_cond_rate,  -- 优惠券打折率
b.p15_cond_amt,  -- 优惠券打折金额
b.p15_expire_dt,  -- 优惠券截止日期
b.p15_create_dt, -- 优惠券创建日期
a.p23_acode,  -- 商店带啊
a.p23_jundate,  -- 销售日期
a.p23_before_amt,  -- 打折前金额
a.p23_after_amt, -- 打折后最终销售金额
a.p23_amount;  -- 打折金额

改了下逗号位置

------解决思路----------------------
引用:
我的意思是一个优惠券(p15_coupon_no) 可以购买很多条商品,就是说购买很多商品的时候可以用一个优惠券就行,

比如优惠券是50%的优惠,那么买一条或者几十条衣服,都是打50%的折扣。

且优惠券有很多个,不只是一个 

是统计每个优惠卷 共销售了多少件衣服?比如你说的有一个优惠卷是50%的优惠,就是查看所有使用这个优惠卷商品总数?

select b.p15_promo_id,  -- 促销分类
a.p23_id_i,          --  购买商品的顾客号
b.p15_coupon_no,  --优惠券号码 
b.p15_cond_rate,  -- 优惠券打折率
b.p15_cond_amt,  -- 优惠券打折金额
b.p15_expire_dt,  -- 优惠券截止日期
b.p15_create_dt, -- 优惠券创建日期
a.p23_acode,  -- 商店带啊
a.p23_jundate,  -- 销售日期
a.p23_before_amt,  -- 打折前金额
a.p23_after_amt, -- 打折后最终销售金额
a.p23_amount , -- 打折金额
(select count(*) from  pos23_pm a,pos_p15 b  
where a.p23_promo_id = b.p15_promo_id(+)
and a.p23_promo_id='PM002976'
and a.p23_coupon_no is not null group by p15_coupon_no)  as qty --统计购买商品的顾客使用这个优惠卷的总数

from pos23_pm a,pos_p15 b  
where a.p23_promo_id = b.p15_promo_id
and a.p23_promo_id='PM002976'
and a.p23_coupon_no is not null;

我这边根据你提供的信息统计:有多少个顾客使用了这个优惠卷的总数;

想要得到商品数量,还要要统计每个顾客使用这个优惠卷买了多少件商品,还需要关联顾客买的商品
------解决思路----------------------
给你个思路 group by查询 select 只能是查询组合函数、group by中出现的字段
然后你自己再思索下吧
------解决思路----------------------
建议百度下group by和count的用法。
都是最简单和最基础的SQL了。
  相关解决方案