有两个表,如图一和图二:
id(编号) | date(日期) | price(金额) |
1 | 2013-10-1 | 0 |
2 | 2013-10-5 | 1.2 |
2 | 2013-11-1 | 2.2 |
3 | 2013-10-12 | 0 |
1 | 2013-11-19 | 0 |
id(编号) | name(名字) |
1 | 小明 |
2 | 小东 |
3 | 小李 |
查询用户操作过的次数和金额总数,效果如图三:
编号 | 姓名 | 操作次数 | 操作金额 |
1 | 小明 | 2 | 0 |
2 | 小东 | 2 | 3.4 |
3 | 小李 | 1 | 0 |
这里主要用到group by语句。其次用个内联和case when...
开始想到的sql语句是:
select a.id 编号,(select b.name from T_user b where a.id=b.id) 姓名,
count(a.date) 操作次数,sum(a.price) 操作金额
from T_action a
group by a.id
但结果如下所示:
编号 | 姓名 | 操作次数 | 操作金额 |
1 | 小明 | 2 | |
2 | 小东 | 2 | 3.4 |
3 | 小李 | 1 |
简单点来说,就是操作金额是0的,不会显示。
........................
........................
........................
........................(这是一个寻找方法的过程,就简单省去了吧)
所以最后语句改成:
select a.id 编号,(select b.name from T_user b where a.id=b.id) 姓名,
count(a.date) 操作次数,
sum(case when a.price>0 then a.price else 0 end) 操作金额
from T_action a
group by a.id
类似的例题还有:
有两个表
b_sign(登记表) | ||
date(日期) | b_id(产品编号) | b_name(产品名称) |
2013-1-1 | 111 | 产1 |
2013-2-1 | 222 | 产2 |
2013-11-11 | 111 | 产1 |
2013-5-15 | 333 | 产3 |
2013-1-16 | 111 | 产1 |
2013-9-1 | 111 | 产1 |
2013-8-4 | 222 | 产2 |
t_product(产品表) | ||
p_id(产品编号) | p_name(产品名称) | p_add(产品出版地) |
111 | 产1 | 广东 |
222 | 产2 | 北京 |
333 | 产3 | 上海 |
444 | 产4 | 西藏 |
要查询的结果是:
结果 | ||
shuliang | b_name | p_add |
4 | 产1 | 广东 |
2 | 产2 | 北京 |
1 | 产3 | 上海 |
select a.shuliang,a.b_name,t_product.p_add
from(select count(b_id) as shuliang,b_name ,b_id from b_sign group by b_name,b_id) a
inner join t_product on a.b_name=t_product.p_name and a.b_id=t_product.p_id
order by a.b_name
select count (b_name) 登记次数,b_name 产品名称 , t_product.p_add 产地 |
| from b_sign ,t_product |
| where b_sign.p_id = t_product.p_id |
| group by b_name |