SQL集萃(一) Case…When…Then 实现无表字段拼表格
2016-04-30 20:36
393 查看
开发过程中,由于自己的sql经验不足,而有些问题通过搜索描述起来又比较复杂,或者问题与结果文不对题,因此写该系列博客,希望通过不断的积累为自己和读者提供一些参考。
业务需求:查询2015年全国、全行业的某终端在用个数、最大负荷、用电量和终端覆盖率。
详细描述:结果以表格形式显示,“全国”列均显示“全国”;行业分为八大行业,该列显示各行业名称,如化工、冶金等;在用终端数、最大负荷、用电量和终端覆盖率均读表即可。
该查询过程涉及到三张表:
q_online_monitorstat(终端表)
pub_region(地区表)
pub_rade(字典表)
终端表含地区的代码(code)外键和终端使用情况;地区表含地区code、名称等对照信息;字典表含行业类别代码和对应名称。
备注:sql语句中66代表全行业;86代表全国。
困难点:三张表的字段中并没有“全国”和“全行业”这几个字,要拼出这样的信息并返回到前台又必须在sql中解决。
解决办法:用Case…When…Then语句,表示那个字段,在何种情况下,实现什么样的效果。
实例:
(SELECT CASE q.ORG_CODE WHEN 86 THEN '全国' end orgName,CASE q.TRADE_CODE WHEN 66 THEN '全行业' end traName,q.MONITOR_NUM,q.MAX_FH,q.YDL,q.COVER_RATE FROM q_online_monitorstat q WHERE q.TRADE_CODE=66 and q.ORG_CODE=86 and q.`STATUS`=1 and q.YM=2015)
UNION
(SELECT c.SHORT_NAME,b.`name`,a.qysl,a.fh,a.ydl,a.fgl
FROM
(SELECT SUM(q.MONITOR_NUM) qysl,q.MAX_FH fh,SUM(q.YDL) ydl,q.COVER_RATE fgl,q.TRADE_CODE type,q.ORG_CODE xcode,q.YM data FROM q_online_monitorstat q WHERE q.`STATUS`=1 and SUBSTR(q.YM,1,4)=2015 and q.ORG_CODE ='86' GROUP BY q.ORG_CODE,q.TRADE_CODE )a,
(SELECT t.ID id,t.NAME name FROM pub_rade t WHERE t.LEVEL=7)b,
(select ORG_CODE,SHORT_NAME from pub_region where ORG_CODE='86')c
WHERE a.type=b.id and c.ORG_CODE=a.xcode limit 0,10);
如图:
上述语句就能实现文章开头中所要求的功能,有兴趣的同学可以随便找两张表尝试一下。
业务需求:查询2015年全国、全行业的某终端在用个数、最大负荷、用电量和终端覆盖率。
详细描述:结果以表格形式显示,“全国”列均显示“全国”;行业分为八大行业,该列显示各行业名称,如化工、冶金等;在用终端数、最大负荷、用电量和终端覆盖率均读表即可。
该查询过程涉及到三张表:
q_online_monitorstat(终端表)
pub_region(地区表)
pub_rade(字典表)
终端表含地区的代码(code)外键和终端使用情况;地区表含地区code、名称等对照信息;字典表含行业类别代码和对应名称。
备注:sql语句中66代表全行业;86代表全国。
困难点:三张表的字段中并没有“全国”和“全行业”这几个字,要拼出这样的信息并返回到前台又必须在sql中解决。
解决办法:用Case…When…Then语句,表示那个字段,在何种情况下,实现什么样的效果。
实例:
(SELECT CASE q.ORG_CODE WHEN 86 THEN '全国' end orgName,CASE q.TRADE_CODE WHEN 66 THEN '全行业' end traName,q.MONITOR_NUM,q.MAX_FH,q.YDL,q.COVER_RATE FROM q_online_monitorstat q WHERE q.TRADE_CODE=66 and q.ORG_CODE=86 and q.`STATUS`=1 and q.YM=2015)
UNION
(SELECT c.SHORT_NAME,b.`name`,a.qysl,a.fh,a.ydl,a.fgl
FROM
(SELECT SUM(q.MONITOR_NUM) qysl,q.MAX_FH fh,SUM(q.YDL) ydl,q.COVER_RATE fgl,q.TRADE_CODE type,q.ORG_CODE xcode,q.YM data FROM q_online_monitorstat q WHERE q.`STATUS`=1 and SUBSTR(q.YM,1,4)=2015 and q.ORG_CODE ='86' GROUP BY q.ORG_CODE,q.TRADE_CODE )a,
(SELECT t.ID id,t.NAME name FROM pub_rade t WHERE t.LEVEL=7)b,
(select ORG_CODE,SHORT_NAME from pub_region where ORG_CODE='86')c
WHERE a.type=b.id and c.ORG_CODE=a.xcode limit 0,10);
如图:
上述语句就能实现文章开头中所要求的功能,有兴趣的同学可以随便找两张表尝试一下。
相关文章推荐
- 控制mysql的查询优化
- SQL Server 2008 评估期已过解决方法
- 数据迁移之SqlBulkCopy对象(一)
- 【MySQL笔记】mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法
- Redis 与 Memcache比较
- 【MySQL笔记】Excel数据导入Mysql数据库的实现方法——Navicat
- 【MySQL笔记】MySql5安装图解教程
- Mysql之对一些数据类型的选用
- MySQL Timeout解析
- mysqli常用方法
- ArrayList模拟数据库的增删改查
- MySQL常用命令
- 关于在rhel6.5下安装oracle11g2
- MySQL关闭过程详解和安全关闭MySQL的方法
- 迁移mysql数据到oracle上
- 自己动手写数据库(三) 持久化方案与索引树
- Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说。。。
- Mysql5-7-11 安装教程
- Tomcat集群+Nginx+Redis服务搭建
- linux下修改oracle数据库用户名称和密码