回 帖 发 新 帖 刷新版面

主题:SQL统计 调用问题,期待高手回复!!!!!!!!!!

我的数据库表中有的人有好多个工种的证件(表1)如何用程序生成(表2)这样的格式
‘…….’表示证号,在这里省略。多谢了!

表1
工号   姓名   工种    证号
001     王     钳工    …….
001     王     汽修    …….
008     李     电工    …….
008     李     木工    …….
008     李     钳工    …….


表1
工号    姓名   工种1    工种2   工种3   工种4
001     王     钳工     汽修
008     李     电工     木工    钳工

回复列表 (共17个回复)

11 楼

*!*    我的数据库表中有的人有好多个工种的证件(表1)如何用程序生成(表2)这样的格式
*!*    ‘…….’表示证号,在这里省略。多谢了!

*!*    表1
CREATE CURSOR temp0 (工号 c(3), 姓名 c(2), 工种 c(4), 证号 c(4))
INSERT INTO temp0 values('001', '王', '钳工', '……')
INSERT INTO temp0 values('001', '王', '汽修', '……')
INSERT INTO temp0 values('008', '李', '电工', '……')
INSERT INTO temp0 values('008', '李', '木工', '……')
INSERT INTO temp0 values('008', '李', '钳工', '……')

*!*    表1
*!*    工号    姓名   工种1    工种2   工种3   证件4
*!*    001     王     钳工     汽修
*!*    008     李     电工     木工    钳工

****分析***********
*!*    对字符不能使用sum()等聚合函数,否则还要转换
*!*    如果知道每人证件的最大数,可用left join

*!*    假设每人证件的最大数为4:
SELECT *, RECNO() id FROM temp0 INTO CURSOR temp1
    
SELECT a.工号, a.id, a.工种, COUNT(*) xh ;
    FROM temp1 a, temp1 b ;
    WHERE a.工号=b.工号 AND a.id>=b.id ;
    GROUP BY a.工号, a.id, a.工种 ;
    INTO CURSOR temp2

SELECT a.*, NVL(b.工种, '    ') 工种1, NVL(c.工种, '    ') 工种2, ;
            NVL(d.工种, '    ') 工种3, NVL(e.工种, '    ') 工种4 ;
    FROM (SELECT DISTINCT 工号, 姓名 FROM temp0) a ;
    LEFT JOIN temp2 b ON a.工号=b.工号 AND b.xh=1 ;
    LEFT JOIN temp2 c ON a.工号=c.工号 AND c.xh=2 ;
    LEFT JOIN temp2 d ON a.工号=d.工号 AND d.xh=3 ;
    LEFT JOIN temp2 e ON a.工号=e.工号 AND e.xh=4 ;
    INTO CURSOR temp

BROWSE

12 楼

set talk off
set safety off
close all
select 工号,姓名 from 表1 group by 工号 into table 表2
select 工号,count(工种) as 工种数 from 表1 group by 工号 into cursor 工种数量
select max(工种数) from 工种数量 into array gzsl
for i=1 to gzsl(1)
  gzm='工种'+alltrim(str(i))  &&工种名
  alter table 表2 add &gzm c(20)  &&假设表1中工种字段长度为20,这里也取20
endfor
select 表2
scan
  gh=alltrim(工号)
  select * from 表1 where 工号=gh into cursor dqgh  &&当前工号
  select dqgh
  count to gzsl  &&工种数量
  for j=1 to gzsl
    select dqgh
    loca for recno()=j
    gzt=alltrim(工种)
    select 表2
    gzm='工种'+alltrim(str(j))
    repl &gzm with gzt
  endfor
  select 表2
endscan
brow
*不管程序漂亮与否,能解决问题的程序才是好程序!

13 楼

工程60多个难道要建立“工种69”这样多的字段吗?楼主应该换一下思路,如果结果中需要列出工人的所有工种也不一定要有60多个工种字段再外加60多个证号字段啊!



楼主还是换个思路吧,其实这样的统计然后生成新表是糟糕的设计,比如工种如果增加了又怎么办呢?还有基本数据变了又要全部重新统计一次吗?效率好象太低了吧!

建议:只要在结果所需要显示或打印时把工种和证号列出就行了嘛,而且最好只统计需要的那一个人就行了!

14 楼

13楼说的有道理,应该换种思路来解决这个问题,老弟,好久不见,还在折腾这玩意啊,佩服!

15 楼

[quote]13楼说的有道理,应该换种思路来解决这个问题,老弟,好久不见,还在折腾这玩意啊,佩服![/quote]
老弟是指我吗?我是工作上天天用VF处理数据(VF编程倒是很少搞),所以折腾这个也正常啊

16 楼

[quote]工程60多个难道要建立“工种69”这样多的字段吗?楼主应该换一下思路,如果结果中需要列出工人的所有工种也不一定要有60多个工种字段再外加60多个证号字段啊!

楼主还是换个思路吧,其实这样的统计然后生成新表是糟糕的设计,比如工种如果增加了又怎么办呢?还有基本数据变了又要全部重新统计一次吗?效率好象太低了吧!

建议:只要在结果所需要显示或打印时把工种和证号列出就行了嘛,而且最好只统计需要的那一个人就行了![/quote]
投13楼一张赞成票!

17 楼

我就纳闷了,这个题我好像做过,怎么又出来了?而且没我的回贴。还有谁见过这样的贴子?

楼主形成表2的目的是什么?
我赞成10、13、14、16楼朋友的意见,换一种思路。学一点数据库原理。做个清楚的人,别胡里胡涂编程,浪费了好时光。

我来回复

您尚未登录,请登录后再回复。点此登录或注册