Foxtable(狐表)用户栏目专家坐堂 → 分组统计与占比统计的问题


  共有4009人关注过本帖树形打印复制链接

主题:分组统计与占比统计的问题

帅哥哟,离线,有人找我吗?
scott518
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
分组统计与占比统计的问题  发帖心情 Post By: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语句,要如何进行占比或份额统计,难道要用分组的和再去除以总数的和吗?

谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/7/21 21:17:00 [只看该作者]

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

 

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

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/7/21 21:28:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By:2014/7/21 21:55:00 [只看该作者]

谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By: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 子句中。


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/7/21 22:58:00 [只看该作者]

 感觉不应该报错才对。select * from c 的时候和分组无关了的。

 回到顶部
帅哥哟,离线,有人找我吗?
scott518
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:292 积分:2488 威望:0 精华:0 注册:2011/11/4 17:32:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
 


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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(制单日期)


 回到顶部
总数 13 1 2 下一页