使用专业的报表工具设计报表模板时,数据准备是一个关键环节。数据准备的核心,实际上是数据库查询SQL语句的编写。

在一个典型的交叉分析报表中,需要显示每个大区、每个月度的销售业绩,如下图:

这个报表的数据集查询语句大致如下:

select DATEPART(month,订购日期) 月份
, 销售大区
, SUM(订单金额) 销售额
from Demo_销售明细
where 订购日期 >='2019-1-1'
 and  订购日期 <'2020-1-1'
 group by DATEPART(month,订购日期)
 , 销售大区

年初时,由于数据很少,表格列上的月份只有1个月,或者很少几个月份,表格行上的大区可能也很少,表格可能会很难看,如下图:

如果想要保证表格的样式不受数据量的影响,就要自动“补齐”月份和大区的列和行。为此,需要在准备报表数据集时想办法。

首先,准备月份列表,12个月,每个月一条记录,SQL语句如下:

select 1 M
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 10
union select 11
union select 12

这个语句是一个不带FROM子句的SQL,其中第一个语句 select 1 M 中的M,是字段别名。后续语句通过UNION合并起来,结果就是一个单字段、12条记录的数据集。如下图:

然后,准备大区列表。为了避免因某些大区暂无销售业绩导致大区列表不全,应从基础资料表查询全部的大区。如果没有这种基础资料表,也可以直接从所有年度的销售数据中抽取大区列表,语句的核心是DISTINCT关键字,SQL语句如下:

select distinct 销售大区 from Demo_销售明细

有了这两个列表,先将这两个列表通过无条件JOIN生成两者的交叉组合全集,再通过LEFT JOIN与实际销售数据关联,即可保证没有业绩的大区-月份组合也会出现在报表数据集中。SQL语句如下:

select MR.M, MR.销售大区, Sales.销售额 from
( select * from 
(  select 1 M
union select 2 union select 3 union select 4 union select 5 union select 6
union select 7 union select 8 union select 9 union select 10 union select 11 union select 12
) Months
 inner join
(  select distinct 销售大区 from Demo_销售明细 ) Regions
on 1=1
) MR left join
(
select DATEPART(month,订购日期) 月份
, 销售大区
, SUM(订单金额) 销售额
from Demo_销售明细
where 订购日期 >='2017-1-1'
 and  订购日期 <'2017-1-2'
 group by DATEPART(month,订购日期)
 , 销售大区
) Sales
 on Sales.月份=MR.M and Sales.销售大区=MR.销售大区

上面这种SQL语句可能看起来很复杂,不易理解。可以采用“通用表表达式(CTE)”改写为:

with Months as
(  select 1 M
union select 2 union select 3 union select 4 union select 5 union select 6
union select 7 union select 8 union select 9 union select 10 union select 11 union select 12
)
, Regions as
(  select distinct 销售大区 from Demo_销售明细
)
, Sales as
( select DATEPART(month,订购日期) 月份
, 销售大区
, SUM(订单金额) 销售额
from Demo_销售明细
where 订购日期 >='2017-1-1'
 and  订购日期 <'2017-1-2'
 group by DATEPART(month,订购日期)
 , 销售大区
)

select M.M, R.销售大区, Sales.销售额 from
 Months M inner join Regions R on 1=1
 left join Sales  on Sales.月份=M.M and Sales.销售大区=R.销售大区

这样的SQL语句相当于创建了3个临时的视图:Months,Regions,Sales,然后基于这些视图做查询。最终生成的数据集记录如下图:

绑定到报表表格之后,显示效果如下图:

可以看到,尽管大多数月份和大区都没有业绩数据,报表仍然完整显示了表格框架。

小结:

(1)用 select 1 union select 2... 这种UNION起来的常数字段值可生成临时的有限数据集合,比如月份列表。

(2)使用DISTINCT关键字,可从业务数据中获取某个分类的完整列表。

(3)使用CTE可简化复杂SQL的结构,既容易看懂,也便于调试。

报表设计中的几个SQL技巧相关推荐

  1. finereport报表设计中模板数据集的sql语句中if的用法_报表工具中动态参数的灵活运用...

    报表开发过程中,有的时候我们会觉得普通参数很难满足一些业务需求,比如第二个数据集要引用第一个数据集的结果进行计算,动态控制 SQL 的过滤条件,动态列等,如果您遇到了这种情况,可以尝试使用动态参数即 ...

  2. 在报表开发工具Stimulsoft Report报表设计中使用存储过程?

    本文主要介绍如何在Stimulsoft Report 设计中使用存储过程. 创建报表或仪表板时,通常使用存储过程来获取数据.在本文中,我们将介绍如何为常用数据源调用存储过程.使用存储过程创建数据源的复 ...

  3. logo设计中的文字有哪些技巧

    logo设计中的文字有哪些技巧 文字往往是一个品牌或产品名称最直观的表达,专注于文字的logo乍一看可能是平淡无奇,但是却非常的醒目.我们可以巧妙地运用文字之间的关系进行设计,通过变化文字.递增字母. ...

  4. 数据库设计中的14个关键技巧

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  5. 如何实现报表设计中的高精度报表套打?

    在许多行业中票据具有严格的行业规范,格式是无法修改的,一旦格式有所改动,票据数据就会失效无效.因此通常情况下,我们会在预先设计好格式的报表的打印版中,手动填写数据信息,如常见的各类账本,报销单等填写数 ...

  6. 网页设计中 透明效果的使用技巧

    运用好透明效果是提高网页设计水准的重要方法之一.如同使用其他方法一样,设计师们有很多种手段将透明效果运用到网页中,今天这篇文章就来好好和您分享一下关于"透明"的实用小技巧哟:) 在 ...

  7. 数据库设计中的14个关键技巧收藏[转]

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  8. altium pcb 信号高亮_在PCB设计中高效的放置元件技巧

    在印刷电路板设计中,设置电路板轮廓后,将零件(占地面积)调用到工作区.然后将零件重新放置到正确的位置,并在完成后进行接线. 组件放置是这项工作的第一步,对于之后的平滑布线工作是非常重要的工作.如果在接 ...

  9. JAVA报表工具中更为动态的SQL查询(FineReport)

    在用Web报表工具查询数据时,经常会遇到查询条件不定的情况,例如参数过滤列是动态变化的:有时想用A列进行过滤,有时想用B列进行过滤.在FineReport报表中,可以将整个查询条件作为参数传入sql中 ...

  10. axure设计出的原型打开自动跳转的问题_Axure原型设计中你不得不知道的技巧(二)...

    上篇讲了控件的使用技巧,相信读者还记忆犹新,这里再跟大家回顾下,控件使用技巧:1.滚动显示动态面板内容 2.如何画折线 3.整块的点击效果 4.输入框加上提示文字 5.连接流程图 6.优化导入图像.这 ...

最新文章

  1. 万能android调用webservice方法——参数类型不受限制
  2. 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部557-561条如下
  3. 快速了解Alias method/别名采样方法
  4. java 唯一id生成算法_分布式全局唯一ID生成方案之snowflake算法
  5. Fraction+mysql_MySQL 数据类型总结
  6. linux nginx 503,GitLab网页500/502/503错误–Nginx无法启动问题排查
  7. 首页静态生成 错误:客户端发现响应内容类型为“text/html”,但应该是“text/xml”...
  8. HDU2030 汉字统计【文本处理】
  9. 字节跳动代理商_横跨字节跳动海外抖音核心代理商爆发!(002803)
  10. C语言中各数据类型和他们对应的最大值和最小值的常量
  11. 收音机磁棒天线4根接法_五六十年代不需要电的收音机,你见过吗?
  12. 在EXCEL中进行趋势拟合与预测的方法
  13. 批处理、分时、实时、网络、分布式操作系统的区别
  14. 手写原笔迹输入_手写原笔迹输入SurfacePro使用更轻松
  15. 一对一语音视频直播双端原生APP源码/thinkphp后台源码/社交交友语音视频聊天即时通信APP源码
  16. 洛谷P3755 [CQOI2017]老C的任务 题解
  17. PCIe | 基础知识点扫盲
  18. 颜色的识别方法和探索 基于matlab
  19. 大青云不显示服务器,37大青云1月4日合服公告
  20. MySql8JDBC操作

热门文章

  1. BZOJ3772:精神污染
  2. 一个遮罩层怎么遮罩两个图层_遮罩动画只能有两个图层,上面为“遮罩层”,下面为“被遮罩”层。...
  3. slt mysql_SAP SLT操作手册 PDF 下载
  4. 微信撤回消息在服务器可以看到吗,微信撤回消息可以查看了,对方撤回了什么一目了然...
  5. 计算机动态评估英语阅读,动态评价理论的国内外研究简述
  6. 【实验记录】yolov5的一些改进tricks总结--持续更ing
  7. centos 7重置密码
  8. VMD常用命令(转载)
  9. golang备忘录003: 使用waitgroup进行graceful shutdown
  10. idea自定义banner