以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  分组统计与占比统计的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=54091)

--  作者:scott518
--  发布时间:2014/7/21 21:08:00
--  分组统计与占比统计的问题

帮助中用如下语句分组统计

\'定义一个GroupTableBuilder,名称为"统计表1",对订单表进行统计。
Dim
b As New GroupTableBuilder("统计表1",DataTables("订单"))
b.Filter = "[客户] = \'CS01\'" \'仅统计客户为CS01的记录
b
.Groups.AddDef("产品") \'根据产品分组
b
.Totals.AddDef("数量") \'对数量进行统计
b
.Build \'生成统计表
MainTable
= Tables("统计表1") \'打开生成的统计表

 

直接用SQL语句如下:

Select 客户,year(制单日期),sum(数量) as 数量,sum(金额) as 金额 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号 flt_where group by 客户,year(制单日期)

 

这两种方式是相同的吗?哪种效率更高?

 

帮助中用g.GrandProportion = True就可以实现占比统计,如果直接用SQL语句,要如何进行占比或份额统计,难道要用分组的和再去除以总数的和吗?

谢谢!


--  作者:有点甜
--  发布时间:2014/7/21 21:17:00
--  

 如果是sqlGroupTableBuilder,和sql语句效率一样,因为最后也是生成一条sql语句执行的。

 

 但是 GroupTableBuilder 统计的是加载后的表,不是统计后台数据库,跟sql语句不是一样,所以无法比较。

 

 明显 GroupTableBuilder 会快一点点,因为已经把表加载了进来。


--  作者:scott518
--  发布时间:2014/7/21 21:28:00
--  
因为表全部是用table动态加载表结构的,查询统计时没有加载任何表,是直接用sql语句从后台的数据库中分组统计后datasurced绑定到窗口的sqltable中的,这样要如何进行占比,份额等类似的统计呢?可以在查询表生成后再用GroupTableBuilder中的g.GrandProportion = True这样的代码统计吗,但此时已经不用b.Groups.AddDef("产品") 分组了,这样占比统计可以吗?如果不可以,直接用sql如何进行占比统计?请甜老师提点一下。

--  作者:有点甜
--  发布时间:2014/7/21 21:33:00
--  

 sql语句计算占比,这样弄

 

select *, 数量 / sum(数量) * 100 as 占比 from (Select 客户,year(制单日期),sum(数量) As 数量,sum(金额) As 金额 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号 flt_where group by 客户,year(制单日期)) c


--  作者:scott518
--  发布时间:2014/7/21 21:55:00
--  
谢谢!
--  作者:scott518
--  发布时间:2014/7/21 22:55:00
--  

Select *, 数量/sum(数量) * 100 As 占比 from (Select 客户,Year(制单日期) as 年,Month(制单日期) as 月,sum(数量) as 数量,sum(金额) as 金额

 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号  group by 客户,Year(制单日期),Month(制单日期)

) c

 

加了sum后会提示出错如下:不用sum函数就可以。

 

.NET Framework 版本:2.0.50727.5477
Foxtable 版本:2014.7.21.1
错误所在事件:
详细错误信息:
选择列表中的列 \'c.客户\' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。


--  作者:有点甜
--  发布时间:2014/7/21 22:58:00
--  
 感觉不应该报错才对。select * from c 的时候和分组无关了的。
--  作者:scott518
--  发布时间:2014/7/21 23:04:00
--  

如果这样就可以,不知道为什么?当然这样占比没意义,只是说明语句执行就不报错,正确输出

 

Select *, 数量/数量 * 100 As 占比 from (Select 客户,Year(制单日期) as 年,Month(制单日期) as 月,sum(数量) as 数量,sum(金额) as 金额

from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号 group by 客户,Year(制单日期),Month(制单日期)

) c


--  作者:有点甜
--  发布时间:2014/7/21 23:15:00
--  

感觉不应该,没理由,你试试这样

 

Select 客户, (数量/sum(数量) * 100) As 占比 from (Select 客户,Year(制单日期) As 年,Month(制单日期) As 月,sum(数量) As 数量,sum(金额) As 金额 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号 group by 客户,Year(制单日期),Month(制单日期)) c
 


--  作者:有点甜
--  发布时间:2014/7/21 23:17:00
--  

 或者可以试试这样,效率虽然低了一些。

 

Select 客户,Year(制单日期) As 年,Month(制单日期) As 月,sum(数量) As 数量,sum(金额) As 金额, sum(数量)/(Select sum(数量) from 订单明细) as 占比 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号 group by 客户,Year(制单日期),Month(制单日期)