在 MS Access 中将几个 table 列为一个 table(转置)

Listing several tables into one table in MS Access (transpose)

这个问题看似很笼统,其实相当复杂。

让我们从软件的基础知识开始:
微软访问 2016
MS SQL 版本。 17.7
DAQFactory 17.1

DAQFactory 是一个SCADA 软件,我用它来测量和存储来自多个温度传感器的数据。我使用 "Export Set" 将传感器数据导出到我的 MSSQL 数据库。我每分钟对传感器数据进行一次采样,生成 1 行传感器数据。我已将其设置为为每个样本创建一个新的 table(因为我只需要在 1 到 10 分钟内采样 10 times/from,这样我就不需要更改我的名称tables 一直)。

我有 6 个温度传感器,DAQFactory 以如下格式导出:

MS SQL 数据库只是一个 carrier/channel 用于我的数据从 DAQFactory 到 MS Access,因此我对数据库没有任何问题。

这是一个学校项目,我不知所措。我为其制作软件包的客户希望将他的数据与其他类型的数据一起收集在报告中。因此,我需要将传感器数据放入如下形式:

我使用 MS Access 创建报告并从我的数据库中收集数据。我已经尝试了几种类型的查询,但我无法让它像我想要的那样工作。

问题是数据库和报表中的 table 行和列的位置相反,我无法在 Access 的查询中切换它(也称为转置) .

我看过其中一些解决方案:

https://access-programmers.co.uk/forums/showthread.php?t=169794

converting column names to use as row fields in Access

JOIN 函数

PIVOT 函数

但我无法让它工作。

导出集:

我所有的导出集都包含相同的列:

[TheTime],
[T_01],
[T_02],
[T_03],
[T_04],
[T_05],
[T_06]

导出集调用:
dbo.Temp_1min
dbo.Temp_2min
dbo.Temp_3min
dbo.Temp_4min
以此类推,最多 10 个。

将其导入Access时,[TheTime]成为主键,所有记录的样本,都记录在同一秒,所以这自然是table的ID。

这是我用来显示数据的代码。我正在使用 "Totals: Last",因此 table 中唯一显示的是每个 table 和传感器的最后一个值。请原谅代码,它的格式为挪威语,但唯一的区别是 "SisteAv",这意味着 "LastOf" 例如 "Totals: Last" 函数。

从"dbo_Temp_1min"table获取最后一个值的代码,这个查询叫做"Temp_Samples1":

SELECT Last(dbo_Temp_1min.TheTime) AS SisteAvTheTime, Last(dbo_Temp_1min.T_01) AS SisteAvT_01, Last(dbo_Temp_1min.T_02) AS SisteAvT_02, Last(dbo_Temp_1min.T_03) AS SisteAvT_03, Last(dbo_Temp_1min.T_04) AS SisteAvT_04, Last(dbo_Temp_1min.T_05) AS SisteAvT_05, Last(dbo_Temp_1min.T_06) AS SisteAvT_06
FROM dbo_Temp_1min;

将几个table合并为一个的代码:

SELECT [SisteAvTheTime], [SisteAvT_01], [SisteAvT_02], [SisteAvT_03], [SisteAvT_04], [SisteAvT_05], [SisteAvT_06] 
FROM Temp_Samples1

UNION

SELECT [SisteAvTheTime], [SisteAvT_01], [SisteAvT_02], [SisteAvT_03], [SisteAvT_04], [SisteAvT_05], [SisteAvT_06] 
FROM Temp_Samples2;

这是我得到的当前结果,列和行与我需要的相反:

澄清我需要什么:

1)第一列列出所有温度传感器的名称(T_01、T_02、T_03等)。

2) 第二列列出来自 table 1 (dbo.Temp_1min).

的最后一行传感器数据

3) 第三列列出来自 table 2 (dbo.Temp_2min)

的最后一行传感器数据

4) 第四列列出最后一行来自 table 3 (dbo.Temp_3min)

的传感器数据

等...

列 "TheTime" 与最终结果无关,应隐藏,因为时间取决于 table 上的名称(1 分钟、2 分钟、3 分钟等)

根据请求,[dbo.Temp_1min] 的 MS SQL 数据库中包含的数据:

TheTime                 T_01          T_02          T_03          T_04          T_05          T_06
----------------------- ------------- ------------- ------------- ------------- ------------- -------------
2018-05-24 15:18:37.000 -0,080911     -0,051013     0,090363      0,034291      -0,096702     -0,016438
2018-05-25 15:04:22.010 0,095227      0,021559      -0,099226     -0,003178     0,099815      -0,015269
2018-05-25 15:04:23.003 0,095226      0,021562      -0,099226     -0,003181     0,099815      -0,015265
2018-05-25 20:06:17.000 0,061521      0,072766      -0,075043     -0,058863     0,085937      0,042978
2018-05-25 20:12:47.000 60,50084      73,64336      -74,18618     -59,89857     85,27211      44,13688
2018-05-25 20:12:47.000 60,50084      73,66345      -74,16626     -59,92236     85,25659      44,16353
2018-05-25 20:06:17.000 0,061521      0,072787      -0,075024     -0,058887     0,085922      0,043005
2018-05-25 20:10:40.003 60,83407      73,37933      -74,46661     -59,5624      85,49031      43,7604
2018-05-25 20:10:40.003 60,83407      73,37933      -74,44677     -59,58627     85,47488      43,78712
2018-05-25 20:23:07.003 58,85883      75,03191      -72,77819     -61,54791     84,16943      45,98995

(10 行受影响)

UNION 查询限制为 50 SELECT 行。您有 10 个表和 6 个传感器,这意味着 60 SELECT 行。如果两者都较少,则单个 UNION 可以合并表,然后 CROSSTAB 可以对数据进行透视。相反,执行 10 个 UNION 查询并加入它们。这是第一个 UNION 的例子。

SELECT TOP 1 TheTime, T_01 AS Min1, "T01" AS Sensor, "1Min" AS Source FROM Temp_1min ORDER BY TheTime DESC
UNION (SELECT TOP 1 TheTime, T_02, "T02", "1Min" FROM Temp_1min ORDER BY TheTime DESC)
UNION (SELECT TOP 1 TheTime, T_03, "T03", "1Min" FROM Temp_1min ORDER BY TheTime DESC)
UNION (SELECT TOP 1 TheTime, T_04, "T04", "1Min" FROM Temp_1min ORDER BY TheTime DESC)
UNION (SELECT TOP 1 TheTime, T_05, "T05", "1Min" FROM Temp_1min ORDER BY TheTime DESC)
UNION (SELECT TOP 1 TheTime, T_06, "T06", "1Min" FROM Temp_1min ORDER BY TheTime DESC);

现在选择一个查询作为 'master' 并将其他 9 个查询加入其中。这是只有 2 个查询的示例。

SELECT [Q1].Sensor, [Q1].Min1, [Q2].Min2
FROM Q2 INNER JOIN Q1 ON [Q2].Sensor = [Q1].Sensor
ORDER BY [Q1].Sensor;

输出(两个表使用相同的示例数据):

Sensor   Min1       Min2
T01    58.85883   58.85883
T02    75.03191   75.03191
T03   -72.77819  -72.77819
T04   -61.54791  -61.54791
T05    84.16943   84.16943
T06    45.98995   45.98995

如果这太难以管理 and/or 执行得太慢以至于不切实际,只有其他方法可以使用 VBA。请参阅 https://www.access-programmers.co.uk/forums/showthread.php?t=299864.

中类似要求的示例