日期:2014-05-16  浏览次数:20492 次

SQL编程实例:Access数据库,两张表的统计,count、sum聚合函数的使用,iif的使用,group by的使用

使用工具:

FineReport报表设计器,Access数据库

需求描述:

有两张表,订单表和订单明细表

1、订单表结构:


2、订单明细表结构:


目的:根据这两张表做出下面的一张表


分析:

1、因为在订单明细里订单ID可能出现多次,所以一定要先把订单ID去重,否则两张表join的时候,订单ID就会有重复的,这时用count函数求订单数量时就会出错了

所以先将订单明细表按订单ID进行分组:

(select 订单ID,sum(数量*单价*(1-折扣)) as 订单销量 from 订单明细 group by 订单ID)
然后再两张表join:

select 单子.订单ID,订购年份,订购月份,订单销量,是否已付 from

(SELECT 订单ID,year("订购日期") as 订购年份,month("订购日期") as 订购月份,是否已付 from 订单) as 单子,
(select 订单ID,sum(数量*单价*(1-折扣)) as 订单销量 from 订单明细 group by 订单ID) as 详情 

where 单子.订单ID=详情.订单ID
2、接下来就是需要对以上求出的这张”总表“进行按年份和月份分组,count(订单ID)求订单数量,sum聚合函数进行带有条件的求和来求已付订单数量等。

解答:

select 订购年份,订购月份,count(订单ID) as 订单数量,sum(订单销量*iif(是否已付=1,1,0)) as 已付订单数量,sum(订单销量) as 销量 from

(select 单子.订单ID,订购年份,订购月份,订单销量,是否已付 from

(SELECT 订单ID,year("订购日期") as 订购年份,month("订购日期") as 订购月份,是否已付 from 订单) as 单子,
(select 订单ID,sum(数量*单价*(1-折扣)) as 订单销量 from 订单明细 group by 订单ID) as 详情 

where 单子.订单ID=详情.订单ID
) 
where 订购年份 =${year}
group by 订购年份,订购月份

部分解释:

1、year,month是帆软设计器自带函数,例如,year函数作用是将2014-5-3取得年份2014

2、iif(是否已付=1,1,0)是Access数据库条件判断,作用是,如果是否已付=1,则返回1,否则返回0

3、${year}是传过来的参数