CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

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

作者: bq wang,  出处:blog, 责任编辑: 李书琴, 
2008-04-02 16:22
  在数据仓库的基本报表制作过程中,通常会使用SQL作为数据源,可是普通的SQL实在不适合处理一些较为复杂的逻辑判断。

  在数据仓库的基本报表制作过程中,通常会使用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)
  )

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2007, ChinaByte
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i