Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Доброго времени суток!

Прошу помочь с составлением запроса для выборки подсчитанных строк. Таблицы devices, details, dev_history.

Необходимо произвести выборку количества строк из details в один столбец и из dev_history в другой столбец.

Зависимости:

(один) devices.dev_id ------> (ко многим) details.dev_id

(один) details.id ------> (ко многим) dev_history.d_id

С помощью конструктора получается запрос такого вида:

SELECT devices.devicetype, Count(details.id) AS [Count-id], Count(dev_history.h_id) AS [Count-h_id], devices.dev_id
FROM (devices INNER JOIN details ON devices.dev_id = details.devtype_id) INNER JOIN dev_history ON details.id = dev_history.d_id
GROUP BY devices.devicetype, devices.dev_id
HAVING (((devices.dev_id)=60));


Получаю результат:

devicetype Count-id Count-h_id
device1 50 50
device2 20 20
device3 40 40


Т.е. все значения в обоих столбцах получаются одинаковыми и совсем неверными.

Заранее благодарен!

К сообщению приложен файл. Размер - 123Kb


Сообщение было отредактировано: 14 окт 16, 23:25
14 окт 16, 22:14    [19783948]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
Махмут
Guest
bravo82 привет
выложи маленький mdb-файл (формат 2003) с небольшим количеством строк и только с этими таблицами
14 окт 16, 23:27    [19784155]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
Анатолий ( Киев )
Guest
Вам нужно вместо таблицы dev_history использовать запрос (сохраненный или вложенный) с группировкой по d_id и Count(dev_history.h_id) AS [Count-h_id]. В основном запросе написать FIRST([Count-h_id]) As [Count-h_id].
Кроме того:
1. Вероятно в таблице dev_history может не быть записей для какого-то details.id, поэтому вместо INNER JOIN лучше применить LEFT JOIN;
2. В вашем запросе логичнее (работает быстрее) вместо HAVING лучше применить WHERE (условие должно быть перед GROUP BY).
17 окт 16, 10:01    [19788627]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Выкладываю файл в 2007. В 2003 перевожу, что-то ругается.

К сообщению приложен файл (db_access.zip - 42Kb) cкачать
19 окт 16, 20:25    [19801740]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Видимо проблема серьезная. Может есть какие варианты?
22 окт 16, 21:43    [19812632]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20642
bravo82
В 2003 перевожу, что-то ругается.
Потому что чистить базу надо от ненужного хлама перед выкладыванием. Там небось формы/отчёты/прочее, для вопроса нафиг ненужное, как лежало, так и лежит...
22 окт 16, 22:35    [19812699]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Akina,
) Да нет там ничего, 3 таблицы и запрос один. Так проблема все-таки в версии?
22 окт 16, 23:23    [19812751]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20642
bravo82
нет там ничего, 3 таблицы и запрос один.
Тогда игнорируй "ругань".
22 окт 16, 23:40    [19812766]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Файл в формате Access 2003 - dbaccess.mdb

К сообщению приложен файл (dbaccess.zip - 17Kb) cкачать
31 окт 16, 20:44    [19843663]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20642
bravo82
Таблицы devices, details, dev_history.

Таблица details не найдена.
Найдена таблица points.
Если представить, что points - это на самом деле details, то
SELECT devices.devicetype, Count(points.id) AS points_count, q1.[Count-h_id] AS dev_history_count
FROM (devices INNER JOIN points ON devices.dev_id = points.dev_id) INNER JOIN (SELECT devices.dev_id, Count(dev_history.h_id) AS [Count-h_id]
FROM (devices INNER JOIN points ON devices.dev_id = points.dev_id) INNER JOIN dev_history ON points.id = dev_history.d_id
GROUP BY devices.dev_id) as q1 ON devices.dev_id = q1.dev_id
GROUP BY devices.devicetype, q1.[Count-h_id];
31 окт 16, 22:12    [19843871]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Akina,

Просто супер!!! Большое спасибо.
3 ноя 16, 19:15    [19857230]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
bravo82
Member

Откуда:
Сообщений: 14
Akina,

Добавил в таблицу dev_history поле r_date (сразу не подумал почему-то), теперь не получается правильный запрос с условием заданного периода between.

SELECT devices.devicetype, Count(points.id) AS points_count, q1.[Count-h_id] AS dev_history_count
FROM (devices INNER JOIN (SELECT devices.dev_id, Count(dev_history.h_id) AS [Count-h_id] FROM (devices INNER JOIN points ON devices.dev_id=points.dev_id) INNER JOIN dev_history ON points.id=dev_history.d_id WHERE q1.[r_date] between #01/01/2015# and #12/31/2015#
GROUP BY devices.dev_id) AS q1 ON devices.dev_id = q1.dev_id) INNER JOIN points ON devices.dev_id = points.dev_id
GROUP BY devices.devicetype, q1.[Count-h_id];

Но ничего не меняется...

Прошу помочь добить задачу. Заранее благодарен Вам.
5 ноя 16, 20:05    [19861046]     Ответить | Цитировать Сообщить модератору
 Re: Выборка значений из двух таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20642
Не, ну надо же думать, чего кодишь... это ж надо догадаться - использовать условие отбора по значению поля из подзапроса В ЭТОМ ПОДЗАПРОСЕ!!!
5 ноя 16, 21:41    [19861267]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить