| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9878 人关注过本帖, 1 人收藏
标题:纵向的数据横向显示出来
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9799
专家分:26886
注 册:2012-2-5
收藏
得分:0 
回复 48楼 sylknb
程序代码:
close databases
create cursor tt (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 tt
index on name+xm tag mm
select * from tesk order by name,kch into cursor ttt
set relation to name+xm into tt
scan
    scatter to aa
    if found("tt")
        replace km2 with aa[3],kc2 with aa[4],zf2 with aa[5],qk2 with aa[6] in tt
    else
        insert into tt(name,xm,km1,kc1,zf1,qk1) values (aa[1],aa[2],aa[3],aa[4],aa[5],aa[6])
    endif
endscan
set relation to
select tt
browse

结果
图片附件: 游客没有浏览图片的权限,请 登录注册

坚守VFP最后的阵地
2016-03-16 22:18
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1528
专家分:180
注 册:2006-6-3
收藏
得分:0 
以下是引用sdta在2016-3-16 22:18:50的发言:

close databases
create cursor tt (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 tt
index on name+xm tag mm
select * from tesk order by name,kch into cursor ttt
set relation to name+xm into tt
scan
   scatter to aa
  if found("tt")
        replace km2 with aa[3],kc2 with aa[4],zf2 with aa[5],qk2 with aa[6] in tt
    else
        insert into tt(name,xm,km1,kc1,zf1,qk1) values (aa[1],aa[2],aa[3],aa[4],aa[5],aa[6])
    endif
endscan
set relation to
select tt
browse
结果
比我写的要简便的多,但有几句不明白,请指教。
1)二表关联父表是不是ttt,子表是不是tt?
2)scan
    scatter to aa 是不是把TTT表中的当前记录放入数组中?aa[1],aa[2],aa[3],aa[4],aa[5],aa[6]) 对应的是name,xm,kch,kc,zf,qk,
scan刚开始时它只是把当前一条记录放入数组,只有光标下移时才能把第二条记录放入数组中。我?aa[1]....?aa[6],怎么显示name,xm相同的,kch,zf,qk不同的二条记录?
   
图片附件: 游客没有浏览图片的权限,请 登录注册

    if found("tt") &此句表示tt表与TTT表记录匹配?,tt表是空的怎么与TTT表匹配呢      
        replace km2 with aa[3],kc2 with aa[4],zf2 with aa[5],qk2 with aa[6] in tt &当二表记录匹配用km2 用aa[3],aa[3]是kch=300怎么能用301替代?
    else
        insert into tt(name,xm,km1,kc1,zf1,qk1) values (aa[1],aa[2],aa[3],aa[4],aa[5],aa[6])
    endif
endscan
2016-03-17 18:18
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
以下是引用sylknb在2016-3-17 18:18:29的发言:

比我写的要简便的多,但有几句不明白,请指教。
1)二表关联父表是不是ttt,子表是不是tt?
2)scan
-----------CUTTING


50楼的 SQL 语句与 51楼的过程语句运行速度的比较:
1. 如果记录增加到 1W 条,速度不明显;
2. 如果记录增加到 10W 条,50楼的 SQL 速度明显要比 51楼的过程语句块(55秒 Vs. 66秒);

测试代码:

Close Databases
Copy File Tesk.Dbf To Tesk_Test.Dbf
Use Tesk_Test

*!*    借用 sylknb 的表,增加记录到 100000 条
For I = 100 To 999
    Select Transform(I) + Right(Name, 9) As Name, Xm, Kch, Kc, Zf, Qk From Tesk Into Cursor Query
    Select Tesk_Test
    Append From Dbf("Query")
Endfor
Select Tesk
Use
Select Tesk_Test

50楼的代码测试:
Clear
Close Databases
Set EngineBehavior 70
Set Null Off
Set NullDisplay To ""

t1 = Seconds( )
   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_Test T1 ;
Left Join Tesk_Test T2 ;
       ON T1.Name = T2.Name And T1.Kch <> T2.Kch ;
 Order By T1.Name Group By T1.Name ;
     Into Cursor Query
 
 ? "耗时 : " + Transform(Seconds( ) - t1) + " 秒"

所以,有时候只要对正具体事情,正确选择合适的语句。
图片附件: 游客没有浏览图片的权限,请 登录注册

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

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
你的方法简明,太好了,自身联接。自身連接中t2.name 为什么在select 语句不要?
现在数据是每人最多2门,如果既有的2门,也有3门,甚至4,5门,哪如何連接?

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

2016-03-17 20:38
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9799
专家分:26886
注 册:2012-2-5
收藏
得分:0 
回复 52楼 sylknb
close databases
create cursor tt (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 tt
index on name+xm tag mm
select * from tesk order by name,kch into cursor ttt &&按照NAME,KCH排序,当然是NAME与XM相同,其它的四个字段内容不同,TTT临时表是父表,TT表是子表
set relation to name+xm into tt
scan
    scatter to aa
    if found("tt") &&此处判断是否找到TT表中的NAME与XM与TTT表的NAME与XM都相同,如果相同,执行REPLACE命令,否则执行INSERT命令
        replace km2 with aa[3],kc2 with aa[4],zf2 with aa[5],qk2 with aa[6] in tt
    else
        insert into tt(name,xm,km1,kc1,zf1,qk1) values (aa[1],aa[2],aa[3],aa[4],aa[5],aa[6])
    endif
endscan
set relation to
select tt
browse

坚守VFP最后的阵地
2016-03-17 21:45
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9799
专家分:26886
注 册:2012-2-5
收藏
得分:0 
以下是引用sylknb在2016-3-17 20:38:11的发言:

你的方法简明,太好了,自身联接。自身連接中t2.name 为什么在select 语句不要?
现在数据是每人最多2门,如果既有的2门,也有3门,甚至4,5门,哪如何連接?

SQL语句不是万能的,看看这个内容:https://blog.bccn.net/sdta/16715,对你是有帮助的

坚守VFP最后的阵地
2016-03-17 21:49
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1528
专家分:180
注 册:2006-6-3
收藏
得分:0 
close databases
create cursor tt (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 tt
index on name+xm tag mm
select * from tesk order by name,kch into cursor ttt &&按照NAME,KCH排序,当然是NAME与XM相同,其它的四个字段内容不同,TTT临时表是父表,TT表是子表
set relation to name+xm into tt
scan
    scatter to aa  &&此命令的解释?:只复制当前单条记录到数组中,为什么此处为什么显示二条记录的内容?
  ?aa[1]....?aa[6]后,显示如图
   
图片附件: 游客没有浏览图片的权限,请 登录注册


if found("tt") &&此处判断是否找到TT表中的NAME与XM与TTT表的NAME与XM都相同,如果相同,执行REPLACE命令,否则执行INSERT命令。
tt表中是空记录怎么会相同?
        replace km2 with aa[3],kc2 with aa[4],zf2 with aa[5],qk2 with aa[6] in tt
    else
        insert into tt(name,xm,km1,kc1,zf1,qk1) values (aa[1],aa[2],aa[3],aa[4],aa[5],aa[6])
    endif
endscan
set relation to
select tt
browse
2016-03-17 22:00
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
以下是引用sdta在2016-3-17 21:49:17的发言:


SQL语句不是万能的,看看这个内容:https://blog.bccn.net/sdta/16715,对你是有帮助的


你是说 https://blog.bccn.net/sdta/16715 的示例不能用 SQL 语句做,是吗?
这种题我可以用三种不同方法的 SQL 语句做,想试试看吗?!

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-17 22:04
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:0 
以下是引用aaaaaa在2016-3-17 20:16:27的发言:

50楼的 SQL 语句与 51楼的过程语句运行速度的比较:
1. 如果记录增加到 1W 条,速度不明显;
2. 如果记录增加到 10W 条,50楼的 SQL 速度明显要比 51楼的过程语句块(55秒 Vs. 66秒);

这样好象会快点:
程序代码:
USE Tesk_Test ALIAS ttt IN 0

t1 = Seconds( ) 
CREATE CURSOR tt (Name C(12), Xm C(8), Kch N(6, 0), Kc C(30), Zf C(3), Qk C(1), Kch2 N(6, 0), Kc2 C(30), Zf2 C(3), Qk2 C(1))
SELECT ttt
INDEX on name TAG mm UNIQUE 
COPY TO tmp
SET ORDER TO 
SELECT tt
APPEND FROM tmp
INDEX on name TAG tt_name
SELECT ttt
SET RELATION TO name INTO "tt"
REPLACE tt.kch2 WITH IIF(ttt.kch != tt.kch, ttt.kch, 0),;
        tt.kc2  WITH IIF(ttt.kch != tt.kch, ttt.kc, ""),;
        tt.zf2  WITH IIF(ttt.kch != tt.kch, ttt.zf, ""),;
        tt.qk2  WITH IIF(ttt.kch != tt.kch, ttt.qk, "") ALL 
SET RELATION TO
? "耗时 : " + Transform(Seconds( ) - t1) + " 秒"
*SELECT tt
*GO TOP 
*BROWSE
2016-03-17 22:38
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:0 
再优化一下,不知能否符合要求。
程序代码:
USE Tesk_Test ALIAS ttt IN 0

t1 = Seconds( ) 
CREATE CURSOR tt (Name C(12), Xm C(8), Kch N(6, 0), Kc C(30), Zf C(3), Qk C(1), Kch2 N(6, 0), Kc2 C(30), Zf2 C(3), Qk2 C(1))
SELECT ttt
INDEX on name TAG mm UNIQUE 
COPY TO tmp
SET ORDER TO 
SELECT tt
APPEND FROM tmp
INDEX on name TAG tt_name
SELECT ttt
SET RELATION TO name INTO "tt"
REPLACE tt.kch2 WITH ttt.kch,;
        tt.kc2  WITH ttt.kc,;
        tt.zf2  WITH ttt.zf,;
        tt.qk2  WITH ttt.qk;
        FOR (ttt.kch != tt.kch) ALL 
SET RELATION TO
? "耗时 : " + Transform(Seconds( ) - t1) + " 秒"
*SELECT tt
*GO TOP 
*BROWSE
2016-03-17 23:11
快速回复:纵向的数据横向显示出来
数据加载中...
 
   



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

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