关于数据仓库中复杂报表SQL语句的写法
来源:互联网 发布:linux shell 定义变量 编辑:程序博客网 时间:2024/05/23 13:03
原创于2008年04月02日,2009年10月18日迁移至此。
在数据仓库的基本报表制作过程中,通常会使用SQL作为数据源,可是普通的SQL实在不适合处理一些较为复杂的逻辑判断;一般而言,待查询的数据类型主要包括日期型、数字型、字符串这三类数据类型;在报表查询界面前段,实际上会对查询的数据作一些缺省处理,例如有些字段可输可不输,输入的字段需要按照输入的内容进行查询,而未输入的字段通常会选择忽略该条件的存在,如何判断该字段是否输入了呢,当然是针对这些未输入的字段提供一些缺省值了,例如某个数字类型的字段未输入,则赋一个缺省值-1,某个字符串字段未输入,则赋一个缺省值为’ ‘,某个日期未输入,则赋一个缺省值为SYSDATE;这个时候只要在SQL中针对不同的缺省值和应该输入的值进行处理就OK了。
当然当更加复杂的查询逻辑实在不适合用SQL处理时,最好选择使用存储过程的方法了;其次过于复杂的SQL可能会带来数据库性能问题,因此这些基于SQL的报表最好不要在大型数据表上操作。
下面是构造了一个包含以上三种数据类型的数据表,并填充了一些测试数据。
CREATE TABLE TestReportParameter
(
VarcharField VARCHAR2(20),
NumberField NUMBER(10,0),
DateField DATE
);
INSERT INTO TestReportParameter VALUES('a',1,SYSDATE-1);
INSERT INTO TestReportParameter VALUES('b',2,SYSDATE);
INSERT INTO TestReportParameter VALUES('c',3,SYSDATE+2);
INSERT INTO TestReportParameter VALUES('d',4,SYSDATE-2);
COMMIT;
处理的秘密在于对缺省值和输入值之间做一个判断,保持任何一种值的存在为TRUE即可。
对于单值数据的处理比较简单,参看下面脚本
SELECT *
FROM TestReportParameter
WHERE (' ' = &VarcharField OR VarcharField = &VarcharField)
AND (-1 = &NumberField OR NumberField = &NumberField)
对于多选值的处理则一定要使用DECODE函数才能避免错误的发生,处理的逻辑同上。
SELECT *
FROM TestReportParameter
WHERE (
' '=DECODE(&VarcharField,' ',' ',&VarcharField)
OR
VarcharField IN (&VarcharField)
)
AND (
-1=DECODE(&NumberField,-1,-1,&NumberField)
OR
NumberField IN (&NumberField)
)
- 关于数据仓库中复杂报表SQL语句的写法
- java面试中关于学员一些sql语句的写法
- 关于mybatis动态SQL语句的写法
- 复杂的sql语句
- 复杂的sql语句
- C#中SQL语句的参数写法
- 复杂sql语句proc写法(动态写法)
- 关于oracle中PL/SQL语句,即存储过程的写法和调用。
- access 中sql语句之“like” 语句的注意写法
- 解析SQL语句中INSERT语句的另一种写法
- access 中sql语句之“like” 语句的注意写法
- SQL语句的写法:update语句中 case...when 用法
- T-SQL中执行sql语句的两种写法
- mybatis的xml中sql语句中in的写法
- 较复杂的sql语句
- 解析Oracle中sql语句的复杂查询
- SQL一些比较复杂的操作语句,不断更新中。。。。。。。
- sql语句中尽量不要使用复杂的函数运算
- oracle增加表空间大小
- PS2协议
- 百度优化google优化长尾词组合
- 各种*nix操作系统下查看网卡带宽
- もし声は記憶しなければ,すぐ私での声はあなたを記憶する.
- 关于数据仓库中复杂报表SQL语句的写法
- 百度优化是最棒的搜索引擎优化之一
- officeXP打开docx文档的方法
- 最强烈鄙视科迈!
- JAVA开发者最常去的20个英文网站
- 关于SQLServer死锁的诊断和定位
- 获取SQLServer的最完整数据字典的SQL语句
- Window下Android SDK安装
- 常用查看连接数命令