标题:用查询,可以把行变成列吗?
只看楼主
xinjie
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:18
帖 子:257
专家分:501
注 册:2007-8-11
得分:0 
交叉表向导
2017-08-26 17:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:2 


CREATE CURSOR tt (学号 C(4), 课程 C(10), 成绩 N(3))
INSERT INTO tt VALUES ("2001", "化学", 80)
INSERT INTO tt VALUES ("2001", "物理", 85)
INSERT INTO tt VALUES ("2002", "化学", 90)
INSERT INTO tt VALUES ("2002", "物理", 95)
INSERT INTO tt VALUES ("2002", "政治", 100)
SELECT DISTINCT 课程 FROM tt INTO CURSOR tmp
cmd = "CREATE CURSOR tj (学号 C(4)"
SCAN
    cmd = cmd + ","+ALLTRIM(tmp.课程)+" N(3)"
ENDSCAN
cmd = cmd + ")"
EXECSCRIPT(cmd)
SELECT DISTINCT 学号 FROM tt INTO CURSOR tmp
SELECT tj
APPEND FROM DBF("tmp")
INDEX on 学号 TAG 学号
SELECT tt
SET RELATION TO 学号 INTO "tj"
SCAN
    REPLACE ("tj."+ALLTRIM(tt.课程)) WITH tt.成绩
ENDSCAN
SET RELATION TO
SELECT tj
BROWSE

[此贴子已经被作者于2017-8-27 10:24编辑过]

2017-08-27 10:23
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:2 
以下是引用sdta在2017-8-25 12:10:33的发言:

课程不固定用VFP代码方便,可以以逸待劳,代码可以重复使用,不用修改
create cursor t2 (学号 c(4),姓名 c(8),课目 c(10),成绩 n(3))
insert into t2 values ("1001","张三","数学",102)
insert into t2 values ("1001","张三","语文",120)
insert into t2 values ("1002","李四","数学",119)
insert into t2 values ("1002","李四","语文",108)
insert into t2 values ("1003","王五","政治",101)
insert into t2 values ("1003","王五","历史",105)  
select distinct 课目 from t2 into array ajg
  
* 创建临时表结构及索引
lcstr=""
for lnI=1 to alen(ajg,1)
    lcstr=lcstr+iif(empty(lcstr),"",",")+alltrim(ajg[lnI,1])+" N(3)"
endfor
create cursor t4 (学号 c(4),姓名 c(8),&lcstr)
index on 学号+姓名 tag xhxm
* 结束 *
  
* 数据处理
select t2
set relation to 学号+姓名 into "t4"
scan
    km=alltrim(t2.课目)
    if found("t4")
        replace (km) with t2.成绩 in "t4"
    else
        insert into t4 (学号,姓名,&km) values (t2.学号,t2.姓名,t2.成绩)
    endif
endscan
set relation to
select t4
set filter to alltrim(学号)=="1002" && 根据情况,这行代码可有可无
browse
sdta 班主:有二个问题不明
1)
select t2
set relation to 学号+姓名 into "t4"   &&&T4是空库t2与t4咋关联?
-----------------------------------------------------------
2)
在scan
if found("t4")
        replace (km) with t2.成绩 in "t4" 此二句代码不理介,t4是空库,只替换成绩,哪学号位与姓名不要替换吗?
endscan
2017-08-28 09:17
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
sdta 班主
t2与t4二库关联后[attach]90975[/attach]
在scan
if found("t4")
        replace (km) with t2.成绩 in "t4" 此二句代码不理介,t4是空库,只替换成绩,哪学号位与姓名不要替换吗?
endscan


[此贴子已经被作者于2017-8-28 09:54编辑过]

2017-08-28 09:38
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 24楼 sylknb
没有学号或者姓名你如何替换成绩

坚守VFP最后的阵地
2017-08-28 11:32
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
以下是引用sdta在2017-8-28 11:32:43的发言:

没有学号或者姓名你如何替换成绩
你的代码如下:

create cursor t4 (学号 c(4),姓名 c(8),&lcstr)
2017-08-28 12:22
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
以下是引用吹水佬在2017-8-27 10:23:15的发言:

 
 
CREATE CURSOR tt (学号 C(4), 课程 C(10), 成绩 N(3))
INSERT INTO tt VALUES ("2001", "化学", 80)
INSERT INTO tt VALUES ("2001", "物理", 85)
INSERT INTO tt VALUES ("2002", "化学", 90)
INSERT INTO tt VALUES ("2002", "物理", 95)
INSERT INTO tt VALUES ("2002", "政治", 100)
SELECT DISTINCT 课程 FROM tt INTO CURSOR tmp
cmd = "CREATE CURSOR tj (学号 C(4)"
SCAN
    cmd = cmd + ","+ALLTRIM(tmp.课程)+" N(3)"
ENDSCAN
cmd = cmd + ")"
EXECSCRIPT(cmd)
SELECT DISTINCT 学号 FROM tt INTO CURSOR tmp
SELECT tj
APPEND FROM DBF("tmp")
INDEX on 学号 TAG 学号
SELECT tt
SET RELATION TO 学号 INTO "tj"
SCAN  
    REPLACE ("tj."+ALLTRIM(tt.课程)) WITH tt.成绩
ENDSCAN
SET RELATION TO
SELECT tj
BROWSE
吹班:
为了解代码历程,我把临时库改为生成物理库
二库关联并在scan--endsc循环中的代码不理介,tt库相同学号有多条,tj库只学号中只有一条,二库如何关联,并记录替换?
2017-08-28 12:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 27楼 sylknb
SET RELATION TO 学号 INTO "tj"
SCAN  
    REPLACE ("tj."+ALLTRIM(tt.课程)) WITH tt.成绩
ENDSCAN
SET RELATION TO
这几句如果不用关联就相当于:
SCAN
    SEEK tt.学号 IN "tj"
    REPLACE ("tj."+ALLTRIM(tt.课程)) WITH tt.成绩
ENDSCAN
建立关联 SET RELATION TO 就会自动 SEEK。
2017-08-28 14:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
如果无建立索引: INDEX on 学号 TAG 学号
如:
SCAN
    SELECT tj
    LOCATE FOR 学号==tt.学号
    REPLACE ("tj."+ALLTRIM(tt.课程)) WITH tt.成绩
ENDSCAN
这样应该好理解。
2017-08-28 14:41
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
吹水佬:
谢谢指教,但我还不是很明白。
我听以前老师说过:子表必须索引,tj是子表
SELECT tt &&这里TT是父表
SET RELATION TO 学号 INTO "tj" &&tj是子表。当父表(tt)的移动记录指定时移动子表中的记录指针。从注释来看应是如下的图

SCAN  &&这里在用scan语句前必须打开有关表,并逐条扫描,这里的表是哪一个?是tt表还是tj表?
    REPLACE ("tj."+ALLTRIM(tt.课程)) WITH tt.成绩
ENDSCAN
2017-08-28 15:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-480271-1-1.html




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

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