注册 登录
编程论坛 VFP论坛

表格列转行

shenxihua 发布于 2023-04-30 22:30, 359 次点击
品种     机号
A         5
B         4
A         1
A         3
A         2
B         6
B         7
我想把表做成:
品种
A        5  1  3  2  
B        4  6  7

请问用VFP怎么实现?高,谢谢!

12 回复
#2
sdta2023-04-30 23:23
程序代码:
CREATE CURSOR test (品种 c(1), 机号 n(1))
INSERT INTO test VALUES ("A", 5)
INSERT INTO test VALUES ("B", 4)
INSERT INTO test VALUES ("A", 1)
INSERT INTO test VALUES ("A", 3)
INSERT INTO test VALUES ("A", 2)
INSERT INTO test VALUES ("B", 6)
INSERT INTO test VALUES ("B", 7)
SELECT 品种, COUNT(*) lnCnt FROM test GROUP BY 1 ORDER BY 2 DESC INTO ARRAY aa
lcStr = "品种 c(1)"
FOR ln = 1 TO aa[1,2]
    lcStr = lcStr + ", S" + TRANSFORM(ln) + " n(1)"
ENDFOR
CREATE CURSOR t1 (&lcStr) && 保存最后结果
INSERT INTO t1 (品种) SELECT DISTINCT 品种 FROM test
INDEX ON 品种 TAG t1
CREATE CURSOR t2 (品种 c(1), js N(4)) && 记录字段列序号
INSERT INTO t2 (品种) SELECT DISTINCT 品种 FROM test
INDEX ON 品种 TAG t2
SELECT test
SCAN
    IF SEEK(test.品种, "t2", "t2") = .T.
        REPLACE js WITH js + 1 IN t2
        ln = t2.js
        IF SEEK(test.品种, "t1", "t1") = .T.
            REPLACE ("S" + TRANSFORM(ln)) WITH test.机号 IN t1
        ENDIF
    ENDIF
ENDSCAN
SELECT t1
BROWSE

只有本站会员才能查看附件,请 登录
#3
sdta2023-04-30 23:24
还可以通过数组的方法解决问题
#4
独木星空2023-04-30 23:54
一种简单的归类,安品种划分记录条就好。
#5
吹水佬2023-05-01 09:48
以下是引用shenxihua在2023-4-30 22:30:08的发言:

品种     机号
A         5
B         4
A         1
A         3
A         2
B         6
B         7
我想把表做成:
品种     ??????
A        5  1  3  2  
B        4  6  7

未看明这样转换想表达什么,有什么意义?
#6
gs25367856782023-05-01 18:39
这样的转置,你还是跑到EXCEL中做,很方便的。
#7
zhken2023-05-01 21:45
*多一种方法理解一下
SELECT 0
CREATE CURSOR 表1(品种 c(5),机号 c(5))
INSERT INTO 表1 VALUES ("A", '5')
INSERT INTO 表1 VALUES ("B", '4')
INSERT INTO 表1 VALUES ("A", '1')
INSERT INTO 表1 VALUES ("A", '3')
INSERT INTO 表1 VALUES ("A", '2')
INSERT INTO 表1 VALUES ("B", '6')
INSERT INTO 表1 VALUES ("B", '7')

SELECT 0
CREATE CURSOR 表2(A c(5),B c(5))

SELECT 表1
GO top
DO WHILE .NOT.EOF()
pz=UPPER(ALLTRIM(品种))
jh=ALLTRIM(机号)
SELECT 表2
LOCATE FOR empty(&pz)
IF .not.FOUND()
APPEND BLANK
ENDIF
REPLACE &pz WITH JH
SELECT 表1
SKIP
ENDDO
SELECT 表2
BROWSE
#8
shenxihua2023-05-02 00:44
谢谢二楼,正是我想要的结果。
七楼的结果行列颠倒了,如果能倒过来就对了。
其实我想要的是机号连成一行文本,写在一个字段里。我就可以转成word文件去打印了。
这样的表现实很有意义的,一个品种有哪机台机在做。
#9
shenxihua2023-05-02 06:33
品种     机号
A         5
B         4
A         1
A         3
A         2
B         6
B         7
我想把表做成:
品种   机        号
A        5  1  3  2  (机号是一个字符型字段)
B        4  6  7
然后我可以做成报表或导出到excel或者word打印。
#10
吹水佬2023-05-02 06:41
以下是引用shenxihua在2023-5-2 06:33:40的发言:

我想把表做成:
品种   机        号
A        5  1  3  2  (机号是一个字符型字段)
B        4  6  7
然后我可以做成报表或导出到excel或者word打印。

2楼的代码变一下就可以,更简单些了。
#11
sdta2023-05-02 07:01
以下是引用shenxihua在2023-5-2 00:44:55的发言:

谢谢二楼,正是我想要的结果。
七楼的结果行列颠倒了,如果能倒过来就对了。
其实我想要的是机号连成一行文本,写在一个字段里。我就可以转成word文件去打印了。
这样的表现实很有意义的,一个品种有哪机台机在做。

程序代码:
CREATE CURSOR test (品种 c(1), 机号 c(1))
INSERT INTO test VALUES ("A", "5")
INSERT INTO test VALUES ("B", "4")
INSERT INTO test VALUES ("A", "1")
INSERT INTO test VALUES ("A", "3")
INSERT INTO test VALUES ("A", "2")
INSERT INTO test VALUES ("B", "6")
INSERT INTO test VALUES ("B", "7")
CREATE CURSOR tt (品种 c(1), jh c(100))
INSERT INTO tt (品种) SELECT DISTINCT 品种 FROM test
INDEX ON 品种 TAG t1
SELECT test
SET RELATION TO 品种 INTO tt
SCAN
    IF FOUND("tt")
        REPLACE jh WITH "," + test.机号 - jh IN tt
    ENDIF
ENDSCAN
SELECT tt
REPLACE jh WITH SUBSTR(jh, 2) ALL
BROWSE
#12
ybq10142023-05-03 17:14
回复 8楼 shenxihua 符合你的要求
CLOSE DATABASES
CREATE CURSOR sb(品种 C (1),机号 N(1))
INSERT INTO sb VALUES ("A",5)
INSERT INTO sb VALUES ("B",4)
INSERT INTO sb VALUES ("A",1)
INSERT INTO sb VALUES ("A",3)
INSERT INTO sb VALUES ("A",2)
INSERT INTO sb VALUES ("B",6)
INSERT INTO sb VALUES ("B",7)
SELECT DISTINCT 品种  FROM sb INTO CURSOR tt READWRITE
ALTER TABLE tt ADD COLUMN 机号 C(20)
INDEX on 品种 TAG pz
SELECT sb
SET RELATION TO 品种 INTO tt
SCAN
   REPLACE 机号 WITH ALLTRIM(机号)+SPACE(2)+ALLTRIM(TRANSFORM(sb.机号)) IN tt
ENDSCAN
SET ORDER TO
DELETE TAG all
SELECT tt
BROWSE

#13
厨师王德榜2023-05-04 11:16
1