注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小木舟的博客

笔墨生活随想,记录似水年华。

 
 
 

日志

 
 

case when如何返回多个字段  

2014-07-27 15:03:30|  分类: 数据分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

         使用case when语句从数据库中提取数据有时候会遇到需要返回多个字段的情况,但case when是不支持返回两个或以上的多个字段的,此时可以考虑使用字符串连接符“||”来解决问题。

         假设有两张数据库表:用户信息表t_user_info和用户的消费记录表t_paylist,如下表1、表2所示:

1 t_user_info

userid

username

address

1000

kaka

前海路

1001

kroos

科技中一路

1002

bale

南新路

……

……

……

2 t_paylist

id

userid

shopname

shop_addr

paynum

1

1000

711

后海大道

35

2

1000

711

后海大道

15

3

1000

711

深南大道

17

4

1000

沃尔玛

蛇口

102

5

1001

amazon

www.z.cn

512

……

……

……

……

……

t_user_info存储用户的id、姓名和住址等信息,t_paylist记录了用户在各个商户的消费记录,以表中的第一行为例,表示编号为1000的用户在位于后海大道的商户711消费了15元。

         现在从表t_user_info中提取10个用户,然后计算每个用户总共在多少个不同的商户有过消费行为以及总的消费金额,位于不同地方的相同连锁店算不同的商户。以表2中编号为1000的用户为例,计算返回的结果需为:商户数 3,总消费金额 169。在写SQL的时候需要注意的一个地方是,从表t_user_info中提取出来的10个用户可能个别用户并没有消费的记录,也即是说在表t_paylist中可能找不到对应的消费信息。

         这是一个需要根据userid进行group by计算的数据提取需求,由于部分用户可能没有消费记录,可以使用用户表left join消费记录表,而根据上面的需求,商户的区分需要根据shopnameshop_addr两个字段,且是在右表的userid为非空的时候才计算,这个可以使用case when进行判断,当右表的userid为非空时返回shopnameshop_addr两个字段。本文最开始的时候提到,case when是不支持返回两个或以上的多个字段的,此时可以使用字符串连接符“||”这个小技巧来连接shopnameshop_addr两个字段然后返回,以区分不同的商户。最终的SQL实现代码如下所示:

SELECT l.userid,
COUNT(DISTINCT(CASE WHEN r.userid IS NOT NULL THEN r.shopname || r.shop_addr END)) AS shop_count,
SUM(CASE WHEN r.userid IS NOT NULL THEN r.paynum END) AS paynum_total
FROM
(
SELECT userid
FROM t_user_info
LIMIT 10
)l LEFT JOIN t_paylist r ON l.userid = r.userid
GROUP BY l.userid

  评论这张
 
阅读(1296)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017