Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

分组转换

虽虽TV  发表于:2021-05-10 11:29:33  
复制

跪求:如下图,如何将表一转换成表二的形式。

 

Top
张志 发表于:2021-05-10 17:25:04
要用VBA代码去实现。或者直接在EXCEL里加工一下。

虽虽TV 发表于:2021-05-10 18:27:17
张志 有几千条以上和数据,EXCEL手工比较麻烦

leoyoung 发表于:2021-05-10 19:52:33
清洗数据,建议使用PQ吧,快捷方便。

chinasa 发表于:2021-05-11 08:07:10
那就用VBA代码往目标表里写呗

西出阳关无故人 发表于:2021-05-11 10:22:55

假如源表为:表1(组别,姓名,编号,电话),目标表为:tmpTbl(id,组别,姓名1,编号1,电话1,姓名2,编号2,电话2,...),则:

Public Sub toCross()
    On Error Resume Next
    '引用ado
    Dim rs As New ADODB.Recordset, Rec As New ADODB.Recordset, sql, i, zb As String, zbNum As Long

    CurrentProject.Connection.Execute "drop table tmpTbl"    '删除已存在的交叉表
    sql = "create table tmpTbl (id AUTOINCREMENT,组别 varchar(50))"
    CurrentProject.Connection.Execute sql    '创建目标表及基础字段
    Application.RefreshDatabaseWindow    '刷新数据库导航窗格
    Err.Clear
    On Error GoTo er
    sql = "SELECT Max(tmp.组别之计算) AS 数量 FROM (SELECT 表1.组别, Count(表1.组别) AS 组别之计算 FROM 表1 GROUP BY 表1.组别)  AS tmp"
    rs.Open sql, CurrentProject.Connection, adOpenStatic, adLockReadOnly    '获得组别中的最多记录数
    For i = 1 To rs.Fields(0)    '添加交叉表的重复性字段
        sql = "alter table tmptbl add COLUMN 姓名" & i & " varchar(50)"
        CurrentProject.Connection.Execute sql
        sql = "alter table tmptbl add COLUMN 编号" & i & " varchar(50)"
        CurrentProject.Connection.Execute sql
        sql = "alter table tmptbl add COLUMN 电话" & i & " varchar(50)"
        CurrentProject.Connection.Execute sql
    Next i
    rs.Close

    Set rs = New ADODB.Recordset
    rs.Open "SELECT * FROM 表1 order by 组别,编号", CurrentProject.Connection, adOpenStatic, adLockReadOnly
    Rec.Open "select * from tmpTbl", CurrentProject.Connection, adOpenStatic, adLockPessimistic
    For i = 1 To rs.RecordCount
        If rs!组别 <> zb Then    '只有更换组别时,目标表才换行
            If Rec.RecordCount > 0 Then Rec.Update    '保存之前未保存的记录,0记录数更新时会出错
            Rec.AddNew    '换行
            Rec!组别 = rs!组别
            zbNum = 1    '调整交叉表的重复性字段序号
        Else
            zbNum = zbNum + 1    '记录交叉表的重复性字段序号
        End If
        Rec("姓名" & zbNum) = rs!姓名
        Rec("编号" & zbNum) = rs!编号
        Rec("电话" & zbNum) = rs!电话
        zb = rs!组别
        rs.MoveNext
    Next i
    Rec.Update    '保存最后一条记录,防止数据丢失

    rs.Close: Rec.Close: Set rs = Nothing: Set Rec = Nothing    '打扫战场

    Exit Sub
er:
    MsgBox "发生错误:" & Err.Number & "," & Err.Description
End Sub




西出阳关无故人 发表于:2021-05-11 10:25:47
另外,你"跪求"的姿势不正确:至少应该要提供源表的实例!!!

虽虽TV 发表于:2021-05-11 17:19:19
西出阳关无故人 感觉感谢!

虽虽TV 发表于:2021-05-11 17:47:45
西出阳关无故人 遵照您的指示,现补上附件。跪求行列转换

总记录:8篇  页次:1/1 9 1 :