Перечисление нескольких таблиц в одну таблицу в MS Access (транспонирование) - PullRequest
0 голосов
/ 24 мая 2018

Этот вопрос может показаться общим, но он довольно сложный.

Начнем с основ программного обеспечения:
MS Access 2016
MS SQL ver.17.7
DAQFactory 17.1

DAQFactory - это программное обеспечение SCADA, которое я использую для измерения и хранения данных от нескольких датчиков температуры.Я использую «Экспортный набор» для экспорта данных датчика в базу данных MSSQL.Я собираю данные датчика раз в минуту, генерируя 1 строку данных датчика.Я настроил его для создания новой таблицы для каждого образца (потому что мне нужно только 10 раз / от 1 до 10 минут, и таким образом мне не нужно постоянно менять имена своих таблиц).

У меня есть 6 датчиков температуры, которые DAQFactory экспортирует в такой формат:

Table view from MS SQL, showing the raw data from DAQFactory, just a sample with six temperature sensors

База данных MS SQL - просто носитель / канал для моих данныхперейти от DAQFactory к MS Access, и поэтому у меня нет никаких проблем с базой данных.

Это школьный проект, и я над головой.Клиент, для которого я создаю программный пакет, хочет собрать свои данные в отчете с другими типами данных.Поэтому мне нужно поместить данные датчика в такую ​​форму:

Table view from the report (the end-result)

Я использую MS Access для создания отчета и сбора данных из моей базы данных.Я пробовал несколько типов запросов, но я не могу заставить его работать так, как я хочу.

Проблема в том, что таблица в базе данных и в отчете имеют противоположное расположение строк и столбцов, и я не могу переключить его в запросе в Access (также называемом транспонированием).

Я рассмотрел некоторые из этих решений:

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

преобразование имен столбцов для использования в качестве полей строк в Access

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] становится первичным ключом, и все записанные выборки записываются в одну и ту же секунду, поэтому это, естественно, идентификатор таблиц.

Вот код, который я использую для отображения моих данных.Я использую «Итоги: последний», поэтому в моей таблице отображается только последнее значение из каждой таблицы и датчика.Извините за код, он отформатирован на норвежском языке, но единственное отличие - «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;

Это текущий результатЯ получаю, и столбец и строки противоположны тому, что мне нужно:

This is the current result I am getting, and as you can see, the column and rows are opposite of what I need for my report (as shown in the first picture)

Чтобы уточнить, что мне нужно:

1) Первый столбец для перечисленияназвания всех датчиков температуры (T_01, T_02, T_03 и т. д.).

2) Второй столбец для отображения последней строки данных датчика из таблицы 1 (dbo.Temp_1min).

3) Третий столбец для отображения последней строки данных датчика из таблицы 2(dbo.Temp_2min)

4) Четвертый столбец со списком последней строки данных датчика из таблицы 3 (dbo.Temp_3min)

и т. д. *

Столбец«TheTime» не имеет отношения к конечному результату и должен быть скрыт, поскольку время зависит от имен в таблицах (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 строк)

1 Ответ

0 голосов
/ 24 мая 2018

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...