| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 176 人关注过本帖
标题:请大师帮忙写一个:数据库查询生成横表的命令
只看楼主 加入收藏
反璞归真
Rank: 1
等 级:新手上路
帖 子:174
专家分:0
注 册:2017-5-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
请大师帮忙写一个:数据库查询生成横表的命令
sjk.rar (132.76 KB)
如何用命令查询生成这种形式
图片附件: 游客没有浏览图片的权限,请 登录注册

科目代码:06化学  07生物学  08历史  09地理

[此贴子已经被作者于2025-10-10 17:04编辑过]

搜索更多相关主题的帖子: 历史 命令 生成 查询 数据库 
2025-10-10 17:01
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:358
专家分:858
注 册:2014-6-12
收藏
得分:5 
回复 楼主 反璞归真
看了下你的dbf

搜索论坛:交叉表

https://bbs.bc-cn.net/viewthread.php?tid=102270&highlight=%BD%BB%B2%E6%B1%ED

2025-10-10 18:14
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:358
专家分:858
注 册:2014-6-12
收藏
得分:0 
以前收藏的“生成交叉表的通用函数”
程序代码:
调用方法:
USE mytable
jcbqh(ALIAS(),1,3,4,.T.) &&或者jcbqh('mytable',1,3,4)
参数1:为打开表的alias(),也就是别名,当前在哪个工作区无所谓,指定别名即可。
参数2:为字符字段,也就是竖轴的field(),指当前mytable中的第几个字段。
参数3:为字符字段,也就是横轴的field(),指当前mytable中的第几个字段。
参数4:为数值型或货币型字段,也就是交叉数值区的field(),指当前mytable中的第几个字段。
参数5:为逻辑型,.T. OR .F.,.T.为行列求和。.F.为不求和。

参数返回:目标工作区别名

FUNCTION jcbqh &&交叉表求和
    LPARAMETERS tctablename,f1,f2,f3,lifsum &&此参数接收alias(),不接受dbf() lifsum参数关于是否合计
    * DIMENSION dtj(255)
    IF PARAMETERS()<4
        MESSAGEBOX("至少要有4个参数!")
        RETURN
    ENDIF
    *当前函数只用到三个字段,第1字段为字符型(纵轴),第2字段为字符型(横轴),第3字段为数值型
    IF !USED(tctablename)
        MESSAGEBOX("表没有打开!",0+48+256,"系统提示")
        RETU
    ENDIF
    mtable=tctablename
    && 源表
    SELECT (mtable)
    IF TYPE(FIELD(f1))<>'C'
        MESSAGEBOX("第1参数类型错误!")
        RETU
    ENDIF
    IF TYPE(FIELD(f2))<>'C'
        MESSAGEBOX("第2参数类型错误!")
        RETU
    ENDIF
    IF (TYPE(FIELD(f3))<>'Y' AND TYPE(FIELD(f3))<>'N')
        MESSAGEBOX("第3参数类型错误!")
        RETU
    ENDIF
    field_temp=ALLTRIM(FIELD(f2))
    * SELECT ALLTRIM(EVAL(FIELD(f2))) DIST FROM &mtable INTO ARRAY dtj
    SELECT &field_temp DIST FROM &mtable INTO ARRAY dtj
    IF ALEN(dtj)>=100
        MESSAGEBOX("横轴字段过多!",0+48+256,"返回")
        RETU
    ENDIF
    kls=ALEN(dtj,1)
    SELECT (mtable)
    *BROWSE
    mbt=FIELD(f1)
    aa=ALLTRIM(FIELD(f1))
    mlist=aa+' as '+mbt
    FOR j =1 TO kls
        jj=TRAN(j)
        jjj=dtj(j)
        bb=FIELD(f2)
        cc=FIELD(f3)
        mlist=mlist+',sum(IIF('+bb+'=dtj(&jj),'+cc+',0.00)) as &jjj'
    ENDFOR
    mlist=mlist+IIF(lifsum,",sum(0.00) as 合计","")+" from "+mtable+" group by "+aa
    IF USED("_temp")
        USE IN _temp
    ENDIF
    SELECT &mlist INTO DBF _temp &&结果表
    IF lifsum
        TOTAL ON 合计 TO lsk
        APPE FROM lsk
        SCAN
            FOR j=1 TO kls
                REPL 合计 WITH 合计+EVALUA(FIELD(j+1))
            ENDFOR
        ENDSCAN
        GO BOTT
        REPLACE &aa WITH '合计'
    ENDIF
    GO TOP
    ERASE lsk.DBF
    BROWSE &&可以注释掉
    RETURN ALIAS()
ENDFUNC
2025-10-10 18:17
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:358
专家分:858
注 册:2014-6-12
收藏
得分:0 
2025-10-10 18:21
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2279
专家分:4768
注 册:2012-2-29
收藏
得分:5 
回复 楼主 反璞归真
这个应该是分类汇总吧,试一试,结果是否是你所需?
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
close all
select *,val(fz) as fs,(icase(alltrim(kmdm)="06",[化学],alltrim(kmdm)="07","生物学",alltrim(kmdm)="08","历史",alltrim(kmdm)="09","地理","")) as xk from kczcb into cursor ttt
select distinct xk from ttt into array laclasses
lcsql = "select zxdm"
for each lcclass in laclasses
    lcsql = lcsql + ", " + "sum(iif(alltrim(xk) = [" + lcclass + "], fs, 0) ) as " + lcclass
endfor
m.lcsql = m.lcsql + " order by zxdm group by zxdm from ttt into table result"
&lcsql
select result
browse
7 天前 06:33
hsfisher
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:148
专家分:118
注 册:2009-4-26
收藏
得分:5 
学习了
7 天前 08:32
反璞归真
Rank: 1
等 级:新手上路
帖 子:174
专家分:0
注 册:2017-5-17
收藏
得分:0 
以下是引用schtg在2025-10-11 06:33:40的发言:

这个应该是分类汇总吧,试一试,结果是否是你所需?

close all
select *,val(fz) as fs,(icase(alltrim(kmdm)="06",[化学],alltrim(kmdm)="07","生物学",alltrim(kmdm)="08","历史",alltrim(kmdm)="09","地理","")) as xk from kczcb into cursor ttt
select distinct xk from ttt into array laclasses
lcsql = "select zxdm"
for each lcclass in laclasses
    lcsql = lcsql + ", " + "sum(iif(alltrim(xk) = [" + lcclass + "], fs, 0) ) as " + lcclass
endfor
m.lcsql = m.lcsql + " order by zxdm group by zxdm from ttt into table result"
&lcsql
select result
browse


查询结果不对,我发的上边的图片是正确的结果
7 天前 08:56
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:420
专家分:140
注 册:2015-4-18
收藏
得分:0 
上个帖子里的语句稍加修改后如下,结果如图
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
SELECT zxdm ;
    ,SUM(IIF(kmdm='06',1,0)) AS 化学 ;
    ,SUM(IIF(kmdm='07',1,0)) AS 生物学 ;
    ,SUM(IIF(kmdm='08',1,0)) AS 历史 ;
    ,SUM(IIF(kmdm='09',1,0)) AS 地理 ;
FROM kczcb ;
GROUP BY zxdm

*06化学  07生物学  08历史  09地理


7 天前 10:24
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2279
专家分:4768
注 册:2012-2-29
收藏
得分:0 
回复 7楼 反璞归真
哈哈,你的是分类汇总、统计个数。
我的是将你表中的fz字段改为数值型后汇总、统计分值。
按照8楼的修改就对啦

[此贴子已经被作者于2025-10-11 10:31编辑过]

7 天前 10:29
反璞归真
Rank: 1
等 级:新手上路
帖 子:174
专家分:0
注 册:2017-5-17
收藏
得分:0 
以下是引用schtg在2025-10-11 10:29:59的发言:

哈哈,你的是分类汇总、统计个数。
我的是将你表中的fz字段改为数值型后汇总、统计分值。
按照8楼的修改就对啦



十分感谢,结果正确
7 天前 14:23
快速回复:请大师帮忙写一个:数据库查询生成横表的命令
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022349 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved