关于数据仓库中复杂报表SQL语句的写法

原创于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)

      )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python与大数据分析

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值