| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9882 人关注过本帖, 1 人收藏
标题:纵向的数据横向显示出来
只看楼主 加入收藏
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
*!*    示例 1 : 最简单的交叉表

Close Databases
*!*    模拟一家公司的年报表的数据
=Rand(-1)
Create Cursor cTest ( 公司 C(10), 年度 I, 销售 N(10, 2), 指标 N(10, 2) )
For lnC = 1 To 10
    For lnY = 2015 To 2016
        Insert Into cTest Values ( '公司 ' + Padl(m.lnC, 2, "0"), m.lnY, 100000*Rand(), 100000*Rand() )
    Next
Next

Local oXtab
oXtab = Newobject("FastXtab", "FastXtab_CN.prg")

*!*    1.1 使用字段名的方式 :
oXtab.cRowField = '公司'  && 行是公司名
oXtab.cColField = '年度'  && 列是年度
oXtab.cDataField = '销售' && 摘要字段是销售额

*!*    1.2 也可以使用字段编号的方式 :
*!*    oXtab.nRowField = 1   && 行是公司名
*!*    oXtab.nColField = 2   && 列是年度
*!*    oXtab.nDataField = 3  && 摘要字段是销售额

oXtab.lBrowseAfter = .T.  && 查询后 Browse 显示
oXtab.lCursorOnly = .T.   && 指定输入的数据源为游标

oXtab.RunXtab()           && 运行查询

=============================================================

*!*    示例 2 = 获取交叉表 + 行/列汇总表 : 显示 = 1销售 / 2指标 / 3完成(销售 - 指标) / 列汇总
Close Databases
*!*    模拟一家公司的年报表的数据
=Rand(-1)
Create Cursor cTest ( 公司 C(10), 年度 I, 销售 N(10, 2), 指标 N(10, 2) )
For lnC = 1 To 10
    For lnY = 2015 To 2016
        Insert Into cTest Values ( '公司 ' + Padl(m.lnC, 2, "0"), m.lnY, 100000*Rand(), 100000*Rand() )
    Next
Next

Local oXtab
oXtab = Newobject("FastXtab", "FastXtab_cn.prg")

oXtab.cRowField  = '公司'     && 行是公司名
oXtab.cColField  = '年度'     && 列是年度
oXtab.nMultiDataField = 3
oXtab.acDataField[1] = '销售' && 摘要字段为销售
oXtab.acDataField[2] = '指标' && 摘要字段为指标
oXtab.anFunctionType[3] = 6
oXtab.acFunctionExp[3] = 'Sum(销售 - 指标)'  && 完成
oXtab.lBrowseAfter = .T.      && 查询后 Browse 显示
oXtab.lCloseTable = .F.       && 不关闭游标
oXtab.lTotalRows = .T.
oXtab.lCursorOnly = .T.       && 指定输入的数据源为游标

oXtab.RunXtab()

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 14:25
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
*!*    示例 3 : 数据归类

Close Databases
*!*    测试数据
Create Cursor no (no i)
Insert Into no Values (  1045)
Insert Into no Values (  1057)
Insert Into no Values (  1582)
Insert Into no Values (100595)
Insert Into no Values (138143)
Insert Into no Values (200129)
Insert Into no Values (400290)
Insert Into no Values (500692)
Insert Into no Values (526834)
Insert Into no Values (604796)
Insert Into no Values (636867)
Insert Into no Values (650205)
Insert Into no Values (702060)
Insert Into no Values (828486)
Insert Into no Values (900428)
Insert Into no Values (915414)
Insert Into no Values (971656)
Insert Into no Values (998987)

Local oXtab
oXtab = Newobject("FastXtab", "FastXtab_CN.prg")

oXtab.nRowField = 0
oXtab.cRowField = ''
oXtab.cColField='Floor(no/100000)+1'
oXtab.cDataField ='no'

oXtab.lBrowseAfter = .T.  && 查询后 Browse 显示
oXtab.lCursorOnly = .T.   && 指定输入的数据源为游标

oXtab.RunXtab()           && 运行查询

说明:
如果要把源表归类分档成 10 类:
图片附件: 游客没有浏览图片的权限,请 登录注册


归类的标准是:1-9999, 100000-199999....
图片附件: 游客没有浏览图片的权限,请 登录注册


民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 14:42
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1528
专家分:180
注 册:2006-6-3
收藏
得分:0 
以下是引用aaaaaa在2016-3-16 14:25:45的发言:

*!*    示例 1 : 最简单的交叉表
 
Close Databases
*!*    模拟一家公司的年报表的数据
=Rand(-1)
Create Cursor cTest ( 公司 C(10), 年度 I, 销售 N(10, 2), 指标 N(10, 2) )
For lnC = 1 To 10
    For lnY = 2015 To 2016
        Insert Into cTest Values ( '公司 ' + Padl(m.lnC, 2, "0"), m.lnY, 100000*Rand(), 100000*Rand() )
    Next
Next
 
Local oXtab
oXtab = Newobject("FastXtab", "FastXtab_CN.prg")
 
*!*    1.1 使用字段名的方式 :
oXtab.cRowField = '公司'  && 行是公司名
oXtab.cColField = '年度'  && 列是年度
oXtab.cDataField = '销售' && 摘要字段是销售额
 
*!*    1.2 也可以使用字段编号的方式 :
*!*    oXtab.nRowField = 1   && 行是公司名
*!*    oXtab.nColField = 2   && 列是年度
*!*    oXtab.nDataField = 3  && 摘要字段是销售额
 
oXtab.lBrowseAfter = .T.  && 查询后 Browse 显示
oXtab.lCursorOnly = .T.   && 指定输入的数据源为游标
 
oXtab.RunXtab()           && 运行查询
 
=============================================================
 
*!*    示例 2 = 获取交叉表 + 行/列汇总表 : 显示 = 1销售 / 2指标 / 3完成(销售 - 指标) / 列汇总
Close Databases
*!*    模拟一家公司的年报表的数据
=Rand(-1)
Create Cursor cTest ( 公司 C(10), 年度 I, 销售 N(10, 2), 指标 N(10, 2) )
For lnC = 1 To 10
    For lnY = 2015 To 2016
        Insert Into cTest Values ( '公司 ' + Padl(m.lnC, 2, "0"), m.lnY, 100000*Rand(), 100000*Rand() )
    Next
Next
 
Local oXtab
oXtab = Newobject("FastXtab", "FastXtab_cn.prg")
 
oXtab.cRowField  = '公司'     && 行是公司名
oXtab.cColField  = '年度'     && 列是年度
oXtab.nMultiDataField = 3
oXtab.acDataField[1] = '销售' && 摘要字段为销售
oXtab.acDataField[2] = '指标' && 摘要字段为指标
oXtab.anFunctionType[3] = 6
oXtab.acFunctionExp[3] = 'Sum(销售 - 指标)'  && 完成
oXtab.lBrowseAfter = .T.      && 查询后 Browse 显示
oXtab.lCloseTable = .F.       && 不关闭游标
oXtab.lTotalRows = .T.
oXtab.lCursorOnly = .T.       && 指定输入的数据源为游标
 
oXtab.RunXtab()
学了有点头绪,但有几个不明白,
1)oXtab.nMultiDataField = 3,oXtab.anFunctionType[3] = 6
oXtab.acFunctionExp[3] = 'Sum(销售 - 指标)' 中的[]的3表示?
2)如果我只要显示公司,年度,销售,指标,不要进行自定义,哪oXtab.nMultiDataField = ?
3)如下如何转换
原表:
图片附件: 游客没有浏览图片的权限,请 登录注册

转换后的表
图片附件: 游客没有浏览图片的权限,请 登录注册

它的参数如何来写?请指教。
2016-03-16 15:54
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
示例 5  : FastXTab.Prg Vs. VFPXTab.Prg 速度比较 :

1. FastXTab.Prg,共 19230 条记录,汇总查询出 : 348 条记录,耗时 : 0.3 秒
2. VFPXTab.Prg, 共 19230 条记录,汇总查询出 : 348 条记录,耗时 : 28 秒

Test.rar (54.13 KB)

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 16:03
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
PO 上来你的采样数据表,便于我测试。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 16:07
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
43 F 第一个问题:
*!*    示例 4 = 获取交叉表,只显示公司,年度,销售,指标,不要列汇总
Close Databases
*!*    模拟四家公司的年报表的数据
=Rand(-1)
Create Cursor cTest ( 公司 C(10), 年度 I, 销售 N(10, 2), 指标 N(10, 2) )
For lnC = 1 To 4
    For lnY = 2015 To 2016
        Insert Into cTest Values ( '公司 ' + Padl(m.lnC, 2, "0"), m.lnY, 100000*Rand(), 100000*Rand() )
    Next
Next
For lnC = 1 To 4
    For lnY = 2015 To 2016
        Insert Into cTest Values ( '公司 ' + Padl(m.lnC, 2, "0"), m.lnY, 100000*Rand(), 100000*Rand() )
    Next
Next

Local oXtab
oXtab = Newobject("FastXtab", "FastXtab_cn.prg")

oXtab.cRowField  = '公司'     && 行是公司名
oXtab.cColField  = '年度'     && 列是年度
oXtab.nMultiDataField = 2
oXtab.acDataField[1] = '销售' && 摘要字段为销售 (_1)
oXtab.acDataField[2] = '指标' && 摘要字段为指标 (_2)
oXtab.lBrowseAfter = .T.      && 查询后 Browse 显示
oXtab.lCloseTable = .F.       && 不关闭游标
oXtab.lCursorOnly = .T.       && 指定输入的数据源为游标

oXtab.RunXtab()


说明:
交叉表一般需要三个参数:行、列和摘要字段,比如: nMultiDataField = 1 (缺省值),表示只有一个摘要字段,如果需要多个摘要字段,比如:销售、指标(供两个),此时定义更多的 nDataField / nFunctionType / cFunctionExp 表达式,即:nMultiDataField = 2,然后赋值多个摘要字段的名称,即:
oXtab.acDataField[1] = '销售' && 摘要字段为销售 (_1)
oXtab.acDataField[2] = '指标' && 摘要字段为指标 (_2)


[此贴子已经被作者于2016-3-16 17:05编辑过]


民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 16:44
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
43 F 第二个问题,
这个问题是和楼主的问题一样的,不属于交叉表的汇总,是行转列的问题,属于坐标变换。
交叉表是一种汇总的运算,列作为分组,行作为分类名,摘要字段作为汇总数。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 16:49
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1528
专家分:180
注 册:2006-6-3
收藏
得分:0 
以下是引用aaaaaa在2016-3-16 16:07:34的发言:

PO 上来你的采样数据表,便于我测试。
附上数据
tesk.rar (8.52 KB)
2016-03-16 17:06
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
Close Databases
Select * From Tesk Order By Name Into Cursor Query
Create Cursor Tesk_New (Name C(12), Xm C(8), Km1 N(6, 0), Kc1 C(30), Zf1 C(3), Qk1 C(1), ;
    Km2 N(6, 0), Kc2 C(30), Zf2 C(3), Qk2 C(1))

Select Tesk
Use
Select Tesk_New
Append Blank
Replace Name With Query.Name, Xm With Query.Xm, Km1 With Query.Kch, Kc1 With Query.Kc, Zf1 With Query.Zf, Qk1 With Query.Qk
Select Query
Go Top
lcName1 = Query.Name
lcName2 = ""
Scan
    lcName1 = Query.Name
    Select Tesk_New
    If lcName1 = lcName2
        Replace Km2 With Query.Kch, Kc2 With Query.Kc, Zf2 With Query.Zf, Qk2 With Query.Qk
    Else
        Append Blank
        Replace Name With Query.Name, Xm With Query.Xm, Km1 With Query.Kch, Kc1 With Query.Kc, Zf1 With Query.Zf, Qk1 With Query.Qk
    Endif
    Select Query
    lcName2 = Query.Name
Endscan

Select Query
Go Top
Select Tesk_New
Go Top
Browse Last

Return


[此贴子已经被作者于2016-3-16 18:49编辑过]


民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 18:46
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
Set EngineBehavior 70
Set Null Off
Set NullDisplay To ""

   Select T1.Name As Name, T1.Xm As Xm, T1.Kch As Km1, T1.Kc As Kc1, T1.Zf As Zf1, T1.Qk As Qk1, ;
          T2.Kch As Km2, T2.Kc As Kc2, T2.Zf As Zf2, T2.Qk As Qk2 ;
     FROM Force Tesk T1 ;
Left Join Tesk T2 ;
       ON T1.Name = T2.Name And T1.Kch <> T2.Kch ;
 Order By T1.Name Group By T1.Name


[此贴子已经被作者于2016-3-16 20:55编辑过]


民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-16 20:47
快速回复:纵向的数据横向显示出来
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038640 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved