日期:2014-05-16 浏览次数:20492 次
使用工具:
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=详情.订单ID2、接下来就是需要对以上求出的这张”总表“进行按年份和月份分组,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}是传过来的参数