0
随着计算机在社会各领域应用的深入,软件开发人员不得不面临着或多或少的数据处理、数据库访问。
在SQL(Structured Query Language)语言DML中,有四大语句堪称其精髓部分。下面就讲述一下其中之一, Case When 语句的用法。本文介绍用它实现数据仓库中的维度转换,来将数据展现给分析人员来进行决策支持与分析。
THEN
ELSE
END
1
在数据仓库数据展现中,我们通常要用到将数据表进行维度转换。如数据仓库中某一关系模式
Vehsm (Roadno, Year , Fluxcount,。。。)
对于数据分析人员来说,他们更想了解某一条高速公路在一段时间内车流量的变化情况,那最好就是将关系表 TB_ADFLUXCOLT 以下面的关系模式来展现
Vehcount_Trans (Roadno, Year Fluxcount 1, .。。。, Year Fluxcount n)
下面笔者就分别以Case When语句、BrioQuery来分别演示一下如何实现维度转换。
2
下面就以DB2数据库为例,以“万能数据库查询分析器” 中文版本《DB 查询分析器》、英文版本《DB Query Analyzer》作为客户端工具来来演示一下Case When 语句如何实现维度转换。
selectuu.roadno,rr.roadname,
from
(
) uu,
(
) rr
whereuu.roadno=rr.roadno
groupbyuu.roadno,rr.roadname
withur;
3
在数据仓库工具中,BrioQuery提供了比较强大的数据展现功能,能方便地实现上面的维度转换。
但对于大数据量表的维度转换来说,则几乎无法完成,笔者在中文核心刊物《电信科学》2003年11期《广东电信公话200专用话机话务动态分析系统的构建》文章中,详细地介绍了“广东电信公话200专用话机话务动态分析系统”中是如何实现这一点的,这个话务动态系统是自己以前在广东省电信有限公司工作的时候独自开发的,有兴趣的话,可以看
本人的优快云博客的博文:
“广东电信公话200专用话机话务动态分析系统的构建”
0
随着计算机在社会各领域应用的深入,软件开发人员不得不面临着或多或少的数据处理、数据库访问。
在SQL(Structured Query Language)语言DML中,有四大语句堪称其精髓部分。下面就讲述一下其中之一,
Left Outer Join |
内连接:当实现同等连接和非同等连接时,分别使用等于和不等于运算符表示的连接条件,匹配源表和目标表中的行,这些连接称为内连接(inner join)。这个和用select查询多表是一样的效果,所以很少用到;等同于 From a,b where a.X=b.X
语法如下:
Select <要选择的字段>
From <主要资料表>
inner join < 次要资料表> [On 规则 ]
外连接:当返回内连接没有包含的行时实现外连接(Outer Join)。外连接分为:左外连接,右外连接,全外连接。left join 是left outer join的简写,left join默认是outer属性的;right join 是right outer join的简写,right join默认是outer属性的。
语法如下:
Select <要查询的字段>
From <<资料表>
[Outer] Join <次要资料表>[On 规则 ]
1
下面就以MS ACCESS数据库为例,以“万能数据库查询分析器” 中文版本《DB 查询分析器》、英文版本《DB Query Analyzer》作为客户端工具来来演示一下Inner Join 和 Outer Join 语句的用法。
之所以选择“万能数据库查询分析器”作为客户端工具,主要是因为,一方面,“万能数据库查询分析器”具有强大的功能、友好的操作界面、良好的操作性、跨越数据库平台。在《程序员》2007第2期的“新产品&工具点评”部分,编辑“特别推荐”了“万能数据库查询分析器”发布。
另一方面,截止到目前,中文版本《DB查询分析器》在国内最著名的软件下载网站“中关村在线”中下载量近9万次,位居整个数据库类排行谤中前20位。
Tb_vehcount (ROADNO, MONTHS, ROADFLUX)
另外:要先使用“控制面板”中“管理工具”下的“数据源(ODBC)”创建数据源OuterJoinAccess ;或者用《DB 查询分析器》/《DB Query Analyzer》中“工具/tools”菜单下的“ODBC数据源管理器/ODBC Data Source Manager”来创建数据源OuterJoinAccess 。
2
下面就以MS ACCESS数据库为例,以“万能数据库查询分析器” 中文版本《DB 查询分析器》在Windows XP上运行,来为客户端工具来来演示一下Outer Join 、 Inner Join 语句的使用。请记住下面的两句话
A
A
运行《DB 查询分析器》,连接上数据源OuterJoinAccess ,用户名与口令均为空(MS ACCESS数据库可不用密码和口令),然后输入以下命令:
select*
fromtb_road
select*
fromtb_ vehcount
SELECT a.AREANO, a.ROADNO, a.ROADNAME, a.STATUS, b.ROADNO, b.MONTHS, b.ROADFLUX
FROM tb_road AS a LEFT JOIN tb_vehcount AS b ON a.ROADNO = b.ROADNO;
SELECT a.areano, a.roadno, a.roadname, a.status, b.roadno, b.MONTHS, b.ROADFLUX
FROM tb_road AS a RIGHT JOIN tb_vehcount AS b ON a.roadno=b.roadno;
SELECT a.areano, a.roadno, a.roadname, a.status, b.roadno, b.MONTHS, b.ROADFLUX
FROM tb_road AS a INNER JOIN tb_vehcount AS b ON a.ROADNO=b.ROADNO;
SELECT a.areano, a.roadno, a.roadname, a.status, b.roadno, b.MONTHS, b.ROADFLUX
FROM tb_road AS a, tb_vehcount AS b
where a.ROADNO=b.ROADNO;
3
下面就以MS ACCESS数据库为例,以“万能数据库查询分析器” 英文版本《DB Query Analyzer》在Windows 2000上运行,来作为客户端工具来来演示一下Outer Join 、 Inner Join 语句的使用。请记住下面的两句话
A
A
运行《DB Query Analyzer》,连接上数据源OuterJoinAccess ,用户名与口令均为空(MS ACCESS数据库可不用密码和口令),然后输入以下命令:
select*
fromtb_road
select*
fromtb_ vehcount
SELECT a.AREANO, a.ROADNO, a.ROADNAME, a.STATUS, b.ROADNO, b.MONTHS, b.ROADFLUX
FROM tb_road AS a LEFT JOIN tb_vehcount AS b ON a.ROADNO = b.ROADNO;
SELECT a.areano, a.roadno, a.roadname, a.status, b.roadno, b.MONTHS, b.ROADFLUX
FROM tb_road AS a RIGHT JOIN tb_vehcount AS b ON a.roadno=b.roadno;
SELECT a.areano, a.roadno, a.roadname, a.status, b.roadno, b.MONTHS, b.ROADFLUX
FROM tb_road AS a INNER JOIN tb_vehcount AS b ON a.ROADNO=b.ROADNO;
SELECT a.areano, a.roadno, a.roadname, a.status, b.roadno, b.MONTHS, b.ROADFLUX
FROM tb_road AS a, tb_vehcount AS b
where a.ROADNO=b.ROADNO;
0 引言
随着计算机在社会各领域应用的深入,软件开发人员不得不面临着或多或少的数据处理、数据库访问。
在SQL(Structured Query Language)语言DML中,有四大语句堪称其精髓部分。下面就讲述一下其中之一,WITH AS语句的用法。
WITH AS短语,也叫做子查询部分,可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。
特别对于UNION ALL比较有用。因为UNIONALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。
语法如下:
[ WITH table_name ]
AS
(query_definition )
1 本例所用工具简单说明
下面就以DB2数据库为例,以“万能数据库查询分析器”中文版本《DB查询分析器》、英文版本《DB Query Analyzer》作为客户端工具来来演示一下Inner Join和 Outer Join语句的用法。
之所以选择“万能数据库查询分析器”作为客户端工具,主要是因为,一方面,“万能数据库查询分析器”具有强大的功能、友好的操作界面、良好的操作性、跨越数据库平台。在《程序员》2007第2期的“新产品&工具点评”部分,编辑“特别推荐”了“万能数据库查询分析器”发布。
另一方面,截止到目前,中文版本《DB查询分析器》在国内最著名的软件下载网站“中关村在线”中下载量近9万次,位居整个数据库类排行谤中前20位。
2 “万能数据库查询分析器”中文版本《DB查询分析器》为例
下面就以DB2数据库为例,以“万能数据库查询分析器”英文版本《DB查询分析器》在Windows XP上运行,来作为客户端工具来来演示一下With As结合Outer Join、 Inner Join语句的使用。
运行《DB查询分析器》,连接上数据源unit4_2,然后输入以下命令:
with w_XROADLEVELas
(
select *from TB_XROADLEVELwhere (areano,roadno)in
(select areano,roadnofrom tb_roadwhere level=2)
)
select u.incroadno,r.roadname,squaddate,
sum(casewhen u.areano=4407and u.outroadno= 1then unpaymoney/100.0else 0end)as out__1,
sum(casewhen u.areano=4407and u.outroadno= 2then unpaymoney/100.0else 0end)as out__2,
sum(casewhen u.areano=4407and u.outroadno= 17then unpaymoney/100.0else 0end)as out_17,
sum(casewhen u.areano=4407and u.outroadno= 22then unpaymoney/100.0else 0end)as out_22,
sum(casewhen u.areano=4407and u.outroadno= 27then unpaymoney/100.0else 0end)as out_27,
sum(casewhen u.areano=4407and u.outroadno= 37then unpaymoney/100.0else 0end)as out_37,
sum(casewhen u.areano=4407and u.outroadno= 40then unpaymoney/100.0else 0end)as out_40,
sum(casewhen u.areano=4407and u.outroadno= 41then unpaymoney/100.0else 0end)as out_41,
sum(casewhen u.areano=4407and u.outroadno= 48then unpaymoney/100.0else 0end)as out_48,
sum(casewhen u.areano=4407and u.outroadno= 49then unpaymoney/100.0else 0end)as out_49,
sum(casewhen u.areano=4407and u.outroadno= 50then unpaymoney/100.0else 0end)as out_50,
sum(casewhen u.areano=4407and u.outroadno= 57then unpaymoney/100.0else 0end)as out_57,
sum(casewhen u.areano=4407and u.outroadno= 58then unpaymoney/100.0else 0end)as out_58,
sum(casewhen u.areano=4407and u.outroadno= 60then unpaymoney/100.0else 0end)as out_60,
sum(casewhen u.areano=4407and u.outroadno= 63then unpaymoney/100.0else 0end)as out_63,
sum(casewhen u.areano=4407and u.outroadno= 70then unpaymoney/100.0else 0end)as out_70,
sum(casewhen u.areano=4407and u.outroadno= 71then unpaymoney/100.0else 0end)as out_71,
sum(casewhen u.areano=4407and u.outroadno= 75then unpaymoney/100.0else 0end)as out_75,
sum(casewhen u.areano=4407and u.outroadno= 80then unpaymoney/100.0else 0end)as out_80,
sum(casewhen u.areano=4407and u.outroadno= 83then unpaymoney/100.0else 0end)as out_83,
sum(casewhen u.areano=4407and u.outroadno= 84then unpaymoney/100.0else 0end)as out_84,
sum(casewhen u.areano=4407and u.outroadno=262then unpaymoney/100.0else 0end)as out262,
sum(casewhen u.areano=4407and u.outroadno=263then unpaymoney/100.0else 0end)as out263,
sum(casewhen u.areano=4407and u.outroadno=264then unpaymoney/100.0else 0end)as out264,
sum(casewhen u.areano=4407and u.outroadno=265then unpaymoney/100.0else 0end)as out265,
sum(casewhen u.areano=4407and u.outroadno=266then unpaymoney/100.0else 0end)as out266,
sum(casewhen u.areano=4407and u.outroadno=267then unpaymoney/100.0else 0end)as out267,
sum(casewhen u.areano=4407and u.outroadno=268then unpaymoney/100.0else 0end)as out268,
sum(casewhen u.areano=4407and u.outroadno=269then unpaymoney/100.0else 0end)as out269,
sum(casewhen u.areano=4407and u.outroadno=272then unpaymoney/100.0else 0end)as out272,
sum(casewhen u.areano=4407and u.outroadno=273then unpaymoney/100.0else 0end)as out273
from
(
select a.areano,a.SquadDate,a.unpaymoney,
case ri.levelwhen 0then a.incroadnowhen 3then xi.roadno
endas incroadno,
case ro.levelwhen 0then a.outroadnowhen 3then xo.roadno
endas outroadno
from w_unpay_veh a
innerjoin tb_road rion a.areano=ri.areanoand a.incroadno=ri.roadno
innerjoin tb_road roon a.areano=ro.areanoand a.outroadno=ro.roadno
leftouterjoin w_XROADLEVEL xion xi.areano=a.areanoand xi.SUBROADNO=a.incroadno
leftouterjoin w_XROADLEVEL xoon xo.areano=a.areanoand xo.SUBROADNO=a.outroadno
where SQUADDATE>='2012-08-01' and SQUADDATE<'2012-09-01'
)as u, tb_road r
where r.areano=4407and u.areano=r.areanoand u.incroadno=r.roadno
groupby u.incroadno,r.roadname,squaddateorderby u.incroadno,squaddate;
图1 输入SQL语句,准备执行(一)
图2 输入SQL语句,准备执行(二)
图3 执行结果
3 “万能数据库查询分析器”英文版本《DB Query Analzyer》为例
下面就以DB2数据库为例,以“万能数据库查询分析器”英文版本《DB Query Analyzer》在Windows 2000上运行,来作为客户端工具来来演示一下With As结合Outer Join、 Inner Join语句的使用。
运行《DB Query Analyzer》,连接上数据源unit4_2,然后输入以下命令:
with w_XROADLEVELas
(
select *from TB_XROADLEVELwhere (areano,roadno)in
(select areano,roadnofrom tb_roadwhere level=2)
)
select u.incroadno,r.roadname,squaddate,
sum(casewhen u.areano=4407and u.outroadno= 1then unpaymoney/100.0else 0end)as out__1,
sum(casewhen u.areano=4407and u.outroadno= 2then unpaymoney/100.0else 0end)as out__2,
sum(casewhen u.areano=4407and u.outroadno= 17then unpaymoney/100.0else 0end)as out_17,
sum(casewhen u.areano=4407and u.outroadno= 22then unpaymoney/100.0else 0end)as out_22,
sum(casewhen u.areano=4407and u.outroadno= 27then unpaymoney/100.0else 0end)as out_27,
sum(casewhen u.areano=4407and u.outroadno= 37then unpaymoney/100.0else 0end)as out_37,
sum(casewhen u.areano=4407and u.outroadno= 40then unpaymoney/100.0else 0end)as out_40,
sum(casewhen u.areano=4407and u.outroadno= 41then unpaymoney/100.0else 0end)as out_41,
sum(casewhen u.areano=4407and u.outroadno= 48then unpaymoney/100.0else 0end)as out_48,
sum(casewhen u.areano=4407and u.outroadno= 49then unpaymoney/100.0else 0end)as out_49,
sum(casewhen u.areano=4407and u.outroadno= 50then unpaymoney/100.0else 0end)as out_50,
sum(casewhen u.areano=4407and u.outroadno= 57then unpaymoney/100.0else 0end)as out_57,
sum(casewhen u.areano=4407and u.outroadno= 58then unpaymoney/100.0else 0end)as out_58,
sum(casewhen u.areano=4407and u.outroadno= 60then unpaymoney/100.0else 0end)as out_60,
sum(casewhen u.areano=4407and u.outroadno= 63then unpaymoney/100.0else 0end)as out_63,
sum(casewhen u.areano=4407and u.outroadno= 70then unpaymoney/100.0else 0end)as out_70,
sum(casewhen u.areano=4407and u.outroadno= 71then unpaymoney/100.0else 0end)as out_71,
sum(casewhen u.areano=4407and u.outroadno= 75then unpaymoney/100.0else 0end)as out_75,
sum(casewhen u.areano=4407and u.outroadno= 80then unpaymoney/100.0else 0end)as out_80,
sum(casewhen u.areano=4407and u.outroadno= 83then unpaymoney/100.0else 0end)as out_83,
sum(casewhen u.areano=4407and u.outroadno= 84then unpaymoney/100.0else 0end)as out_84,
sum(casewhen u.areano=4407and u.outroadno=262then unpaymoney/100.0else 0end)as out262,
sum(casewhen u.areano=4407and u.outroadno=263then unpaymoney/100.0else 0end)as out263,
sum(casewhen u.areano=4407and u.outroadno=264then unpaymoney/100.0else 0end)as out264,
sum(casewhen u.areano=4407and u.outroadno=265then unpaymoney/100.0else 0end)as out265,
sum(casewhen u.areano=4407and u.outroadno=266then unpaymoney/100.0else 0end)as out266,
sum(casewhen u.areano=4407and u.outroadno=267then unpaymoney/100.0else 0end)as out267,
sum(casewhen u.areano=4407and u.outroadno=268then unpaymoney/100.0else 0end)as out268,
sum(casewhen u.areano=4407and u.outroadno=269then unpaymoney/100.0else 0end)as out269,
sum(casewhen u.areano=4407and u.outroadno=272then unpaymoney/100.0else 0end)as out272,
sum(casewhen u.areano=4407and u.outroadno=273then unpaymoney/100.0else 0end)as out273
from
(
select a.areano,a.SquadDate,a.unpaymoney,
case ri.levelwhen 0then a.incroadnowhen 3then xi.roadno
endas incroadno,
case ro.levelwhen 0then a.outroadnowhen 3then xo.roadno
endas outroadno
from w_unpay_veh a
innerjoin tb_road rion a.areano=ri.areanoand a.incroadno=ri.roadno
innerjoin tb_road roon a.areano=ro.areanoand a.outroadno=ro.roadno
leftouterjoin w_XROADLEVEL xion xi.areano=a.areanoand xi.SUBROADNO=a.incroadno
leftouterjoin w_XROADLEVEL xoon xo.areano=a.areanoand xo.SUBROADNO=a.outroadno
where SQUADDATE>='2012-08-01' and SQUADDATE<'2012-09-01'
)as u, tb_road r
where r.areano=4407and u.areano=r.areanoand u.incroadno=r.roadno
groupby u.incroadno,r.roadname,squaddateorderby u.incroadno,squaddate;
图1 输入SQL语句,准备执行(一)
图2 输入SQL语句,准备执行(二)
图3 执行结果
0 引言
随着计算机在社会各领域应用的深入,软件开发人员不得不面临着或多或少的数据处理、数据库访问。
在SQL(Structured Query Language)语言DML中,有四大语句堪称其精髓部分。下面就讲述一下其中之一,UNION、UNION ALL语句的用法。
UNION 操作符用于合并两个或多个SELECT语句的结果集。
请注意,UNION内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中的列的顺序必须相同。
UNION 语法如下:
SELECT column1, column2,…, columnX
FROM table_name1
UNION
SELECT column1, column2,…, columnX
FROM table_name2
UNION ALL语法如下:
SELECT column1, column2,…, columnX
FROM table_name1
UNION ALL
SELECT column1, column2,…, columnX
FROM table_name2
UNION与UNION ALL的区别:
UNION操作符选取不同的值,即UNION是去了重的。如果允许重复的值,请使用UNION ALL。
1 本例所用工具简单说明
下面就以DB2数据库为例,以“万能数据库查询分析器”中文版本《DB查询分析器》、英文版本《DB Query Analyzer》作为客户端工具来来演示一下Inner Join和Outer Join 语句的用法。
之所以选择“万能数据库查询分析器”作为客户端工具,主要是因为,一方面,“万能数据库查询分析器”具有强大的功能、友好的操作界面、良好的操作性、跨越数据库平台。在《程序员》2007第2期的“新产品&工具点评”部分,编辑“特别推荐”了“万能数据库查询分析器”发布。
另一方面,截止到目前,中文版本《DB查询分析器》在国内最著名的软件下载网站“中关村在线”中下载量近9万次,位居整个数据库类排行谤中前20位。
2 建立MYSQL数据库的ODBC数据源UNION_MYSQL
《DB 查询分析器》是通过ODBC数据源来访问各种数据库及EXCEL的,所以首先要建立要访问的数据库或EXCEL的ODBC数据源。如果您的主机上没有对应数据库的ODBC驱动程序,那您还要下载(通常该数据库厂家的官方网站上都提供有ODBC驱动程序下载)安装对应数据库的ODBC驱动程序,然后再建立相应的ODBC数据源。
3 “万能数据库查询分析器”中文版本《DB查询分析器》为例
下面就以MYSQL数据库为例,以“万能数据库查询分析器”中文版本《DB查询分析器》在Windows XP上运行,来作为客户端工具来来演示一下UNION、UNION ALL语句的使用。
运行《DB Query Analyzer》,连接上数据源UnionAccess,用户名与口令均为空(MS ACCESS数据库可不用密码和口令),然后输入以下命令:
需要注意的是,TB_area数据表本身就有重复记录
SELECT AREANO,AREANAME,AREASERVERIP
FROM `tb_area`
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area2"
SELECT AREANO,AREANAME,AREASERVERIP
FROM `tb_area`
UNION
SELECT AREANO,AREANAME,AREASERVERIP
FROM `tb_area2`
SELECT AREANO,AREANAME,AREASERVERIP
FROM `tb_area`
UNION ALL
SELECT AREANO,AREANAME,AREASERVERIP
FROM `tb_area2`
大家想一下,表tb_area本身就有重复记录,那如果是tb_area自身Union,结果会是怎么样???
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
UNION
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
4 “万能数据库查询分析器”英文版本《DB Query Analzyer》为例
下面就以MS ACCESS数据库为例,以“万能数据库查询分析器”英文版本《DB Query Analyzer》在Windows 2000上运行,来作为客户端工具来来演示一下UNION、UNION ALL语句的使用。
运行《DB Query Analyzer》,连接上数据源UnionAccess,用户名与口令均为空(MS ACCESS数据库可不用密码和口令),然后输入以下命令:
需要注意的是,TB_area数据表本身就有重复记录
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area2"
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
UNION
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area2"
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
UNIONALL
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area2"
大家想一下,表tb_area本身就有重复记录,那如果是tb_area自身Union,结果会是怎么样???
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
UNION
SELECT "AREANO", "AREANAME", "AREASERVERIP"
FROM "Tb_area"
由于篇幅原因,在Oracle、Sybase、MS SQL Server、Informix数据库上的操作就不再赘述,有兴趣的朋友自己可以去操作一下。
《DB查询分析器》使用技巧 系列:
《DB 查询分析器》使用技巧之(一)
http://blog.youkuaiyun.com/magenfeng/article/details/7189174
《DB 查询分析器》使用技巧之(二)
http://blog.youkuaiyun.com/magenfeng/article/details/7189176
《DB 查询分析器》使用技巧之(三)
http://blog.youkuaiyun.com/magenfeng/article/details/7192402
《DB 查询分析器》使用技巧之(四)
http://blog.youkuaiyun.com/magenfeng/article/details/7195059
《DB 查询分析器》使用技巧之(五)
http://blog.youkuaiyun.com/magenfeng/article/details/7196846
《DB 查询分析器》使用技巧之(六)
http://blog.youkuaiyun.com/magenfeng/article/details/7164432
《DB 查询分析器》使用技巧之(七)
http://blog.youkuaiyun.com/magenfeng/article/details/7197934