【问题标题】:Listing several tables into one table in MS Access (transpose)在 MS Access(转置)中将多个表列在一个表中
【发布时间】:2018-05-25 05:13:24
【问题描述】:

这个问题可能看起来很笼统,但它相当复杂。

让我们从软件的基础开始:
MS Access 2016
MS SQL 版本。 17.7
数据工厂 17.1

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

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

MS SQL 数据库只是我的数据从 DAQFactory 到 MS Access 的载体/渠道,因此我对数据库没有任何问题。

这是一个学校项目,我无法应付。我正在为其制作软件包的客户希望在包含其他类型数据的报告中收集他的数据。因此我需要把传感器数据变成这样的形式:

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

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

我查看了其中一些解决方案:

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

converting column names to use as row fields in Access

Access - transpose some column data into row records

加入函数

PIVOT 函数

但我无法让它工作。

导出集:

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

[时代],
[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]成为主键,并且所有记录的样本都记录在完全相同的秒内,因此这自然是表的ID。

这是我用来显示数据的代码。我正在使用“总计:最后一个”,因此我表中显示的唯一内容是每个表和传感器的最后一个值。对不起,代码是挪威语格式,但唯一的区别是“SisteAv”,意思是“LastOf”,例如“Totals: Last”函数。

从“dbo_Temp_1min”表中获取最后一个值的代码,这个查询称为“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;

将多个表合二为一的代码:

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) 第二列列出表 1 中最后一行传感器数据 (dbo.Temp_1min)。

3)第三列列出表2中最后一行传感器数据(dbo.Temp_2min)

4) 第四列列出表 3 中最后一行传感器数据 (dbo.Temp_3min)

等等……

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

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

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 行)

【问题讨论】:

  • 我一头雾水,第一张图不是原始数据,不是想要的输出吗?将样本原始数据发布为表格,而不是图像。为想要的结果做同样的事情。
  • 我不知道如何发布表格,但我已经更新了我的问题以包含原始数据,这些原始数据是从 MS SQL 以“结果到文本 (Ctrl + T)”格式复制的。如果您想要其他格式,请说明我如何提供。

标签: sql ms-access transpose


【解决方案1】:

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);

现在选择一个查询作为“主”并将其他 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

如果这太难以管理和/或执行速度太慢以至于不切实际,则只有其他方法可以使用 VBA。请参阅https://www.access-programmers.co.uk/forums/showthread.php?t=299864 中的类似要求示例。

【讨论】:

  • 好的,谢谢!我根据您的建议定制了我的代码并且它有效。现在我知道查询按预期工作,我更改了所有查询名称以使其易于理解。我现在有 10 个查询加入了一个 INNER JOIN 查询
猜你喜欢
  • 2020-05-19
  • 2021-11-17
  • 2014-09-10
  • 2016-03-23
  • 2023-03-12
  • 1970-01-01
  • 2017-03-30
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多