首页 > 解决方案 > 有没有一种简单的方法来取消交叉表查询?(标准化)

问题描述

我刚刚继承了一个新的数据库来维护。但是其中一张桌子不是很好。我可以编写一个复杂的查询来解决这个问题,但这会很长而且很乏味。我想知道是否有更简单的方法?

该表如下所示:

姓名 数据点 日期1 日期 2 日期 3 日期 4 ... 日期N
α 是的 日期 日期 日期 日期 ... 日期
测试版 日期 日期 日期 日期 ... 日期

事情是,我需要它看起来像这样:

姓名 数据点 日期猫 日期
α 是的 日期1 日期
测试版 日期2 日期
α 是的 日期3 日期
测试版 日期4 日期
α 是的 日期2 日期
测试版 日期1 日期

现在交叉表可以让我从我想要的东西变成我拥有的东西,有没有一种简单的方法来做相反的事情,或者这是一个“弄脏你的手并手动做”的情况?我正在考虑导出表格,将其放入 pandas 并以这种方式进行操作,因为我知道我可以在那里完成。希望 Access 有内置的东西吗?

标签: ms-accessdatabase-design

解决方案


虽然 Access 没有一个内置函数来执行您想要的操作,但使用 VBA 创建一些内容相对容易,该 VBA 循环第一个表中的字段以根据需要输出数据。就像是:

Sub sUnXTabData()
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim rsSteer As DAO.Recordset
    Dim rsData As DAO.Recordset
    Dim intCount As Integer
    Dim intLoop1 As Integer
    Set db = CurrentDb
    Set rsSteer = db.OpenRecordset("SELECT * FROM tblXTab;")
    If Not (rsSteer.BOF And rsSteer.EOF) Then
        db.Execute "DELETE * FROM tblNotXTab;"
        Set rsData = db.OpenRecordset("SELECT * FROM tblNotXTab WHERE 1=2;")
        intCount = rsSteer.Fields.Count - 1
        Do
            For intLoop1 = 2 To intCount
                rsData.AddNew
                rsData("Name") = rsSteer("Name")
                rsData("Datapoint") = rsSteer("Datapoint")
                rsData("DateCat") = rsSteer.Fields(intLoop1).name
                rsData("Date") = rsSteer.Fields(intLoop1)
                rsData.Update
            Next intLoop1
            rsSteer.MoveNext
        Loop Until rsSteer.EOF
    End If
sExit:
    On Error Resume Next
    rsSteer.Close
    rsData.Close
    Set rsSteer = Nothing
    Set rsData = Nothing
    Set db = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sUnXTabData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

请注意,NameandDate是 Access 中的保留字,因此您应该更改它们。

问候,


推荐阅读