ms-access - 有没有一种简单的方法来取消交叉表查询?(标准化)
问题描述
我刚刚继承了一个新的数据库来维护。但是其中一张桌子不是很好。我可以编写一个复杂的查询来解决这个问题,但这会很长而且很乏味。我想知道是否有更简单的方法?
该表如下所示:
姓名 | 数据点 | 日期1 | 日期 2 | 日期 3 | 日期 4 | ... | 日期N |
---|---|---|---|---|---|---|---|
α | 是的 | 日期 | 日期 | 日期 | 日期 | ... | 日期 |
测试版 | 不 | 日期 | 日期 | 日期 | 日期 | ... | 日期 |
事情是,我需要它看起来像这样:
姓名 | 数据点 | 日期猫 | 日期 |
---|---|---|---|
α | 是的 | 日期1 | 日期 |
测试版 | 不 | 日期2 | 日期 |
α | 是的 | 日期3 | 日期 |
测试版 | 不 | 日期4 | 日期 |
α | 是的 | 日期2 | 日期 |
测试版 | 不 | 日期1 | 日期 |
现在交叉表可以让我从我想要的东西变成我拥有的东西,有没有一种简单的方法来做相反的事情,或者这是一个“弄脏你的手并手动做”的情况?我正在考虑导出表格,将其放入 pandas 并以这种方式进行操作,因为我知道我可以在那里完成。希望 Access 有内置的东西吗?
解决方案
虽然 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
请注意,Name
andDate
是 Access 中的保留字,因此您应该更改它们。
问候,
推荐阅读
- javascript - 如何使用 JavaScript 查找一个字符是否在字符串中多次出现?
- c - 如果存在等于给定数字的数字组合,则打印
- macos - macOS 上的终端/iTerm2 窗口名称:如何取消 SSH 以显示下一个进程?
- javascript - 将对象传播到参数中?
- algorithm - 将椭圆弧拟合到点或其他曲线
- node.js - 在 Discord.js 中查找所有具有角色的成员
- javascript - 无法读取未定义和未定义的属性“纬度”
- datetime - 修复脚本以输入 2021-02-01 而不是 2021-02-32
- r - R从数据框中的句子中删除单词
- matlab - 在 Matlab 中创建 if else 语句以选择正确的矩阵