有两个表,如图一和图二:
| 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 |

本文深入探讨了SQL查询中的groupby语句应用,并通过两个实际案例详细解释如何使用SQL来解决复杂的数据聚合问题,包括操作次数、金额计算以及产品统计等。案例涉及数据表的关联、条件筛选和聚合函数的运用。
3076

被折叠的 条评论
为什么被折叠?



