Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40

Выборка из нескольких таблиц

14.03.2016, 16:16. Показов 4252. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, выручайте. Я SQL вообще не знаю, а задание надо сделать, дедлайн скоро. Сижу, читаю, но никак не могу понять, как правильно сделать. Помогите, пожалуйста или тыкните, где почитать, где разжевано для чайников.

Сама база данных (представлена на картинке)
Кто что делает:
Справочник типов сообщений – таблица QRY_TYPE (ID – уникальный идентификатор типа, С_NAME – название типа, C_AB_REF – ссылка на абонента который обрабатывает данные типы сообщений).

Справочник типов абонентов – таблица ST_ABONENTS (ID – уникальный идентификатор абонента, С_NAME – название абонента)

Входящая очередь сообщений – таблица QRY_QUEUE (ID – уникальный идентификатор сообщения, С_IN_TIME – дата и время записи в таблицу, C_EXEC_TIME – дата и время обработки сообщения, C_ST – статус обработки сообщения (null - сообщение не обработано, 1 – сообщение успешно обработано, 0 – ошибка при обработке сообщения), C_QRY_TYPE – ссылка на тип запроса)

Собственно задания:
1. Сколько сообщений в разрезе абонентов было получено за рабочий день (с 9-00 до 18-00)
2. Типы сообщений у которых процент ошибок при обработке более 5%
3. ТОП 3 абонентов по количеству сообщений
Миниатюры
Выборка из нескольких таблиц  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2016, 16:16
Ответы с готовыми решениями:

Выборка из нескольких таблиц
Как можно сделать такую выборку с помощью SELECT из выражения: П StudentID, Title, Semester (StudyCourse x participated x (σ...

Выборка данных из нескольких таблиц
Здравствуйте, проблема такая. Нужно проверить правильность запроса, кому несложно) 1. Вывести фамилию, должность, название отдела и...

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

7
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
14.03.2016, 16:35
Цитата Сообщение от TitanKomi Посмотреть сообщение
Сколько сообщений в разрезе абонентов было получено
Прошу уточнить. Здесь мы должны работать по времени прихода сообщения C_IN_TIME? Или, все-таки по времени обработки? Как считается рабочий день - по времени прихода или времени обработки? Собственно, тут тоже можно сделать два варианта.
Цитата Сообщение от TitanKomi Посмотреть сообщение
Типы сообщений у которых процент ошибок
. Интересно, а необработанные сообщения должны ли каким-то образом влиять на процент ошибки? И что есть 100% - все сообщения или только успешно и неуспешно обработанные? И что за козел такие неряшливые постановки делает?
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 16:52  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
Здесь мы должны работать по времени прихода сообщения C_IN_TIME?
По времени прихода. Рабочий день тоже по времени прихода. Но начинается он в 9:00.

Цитата Сообщение от AGK Посмотреть сообщение
каким-то образом влиять на процент ошибки? И что есть 100%
]
100% абсолютно все пришедшие сообщения.

Про козлов ничего не знаю

Добавлено через 12 минут
Необработанные не влияют на процент ошибки
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
14.03.2016, 17:15
Цитата Сообщение от TitanKomi Посмотреть сообщение
100% абсолютно все пришедшие сообщения.
Необработанные не влияют на процент ошибки
То есть, все-таки не абсолютно все, а только обработанные без ошибок и обработанные с ошибками
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 17:31  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
все-таки не абсолютно все
Кажется, я не правильно написал.
Когда мы считаем общее количество пришедших сообщений(100%): мы используем обработанные с ошибкой и без ошибки, а также необработанные.
Когда мы считаем процент, то мы исходим из 100%, в которых есть все сообщения, которые приходили в том числе и необработанные.
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
14.03.2016, 17:35
Возьмем селект из другой темы ТС и слегка преобразуем
Цитата Сообщение от AGK Посмотреть сообщение
...
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT c_name, COUNT(*) cnt, 
FROM ( 
SELECT q.id, q.c_in_time, q.c_st, a.c_name 
FROM   qry_queue q, 
       qry_type t, 
       st_abonents a 
WHERE a.c_qry_type = t.id 
  AND t.c_ab_ref = a.id 
  AND (q.c_in_time - trunc(q.c_in_time)) BETWEEN 3/8 AND 3/4
) GROUP BY c_name
ORDER BY c_name;
Это все сообщения, полученные за рабочий день. Если нужны не все, а обработанные без ошибки, с ошибкой или не обработанные, надо брать соответствующие count из указанной выше темы. Уточню, что 3/8 - это 9:00, а 3/4 - это 18:00
1
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 18:05  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
все сообщения, полученные за рабочий день
Получает данный запрос отображает нам имя абонента и кол-во всех сообщений за день?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
14.03.2016, 18:22
Лучший ответ Сообщение было отмечено TitanKomi как решение

Решение

Цитата Сообщение от TitanKomi Посмотреть сообщение
Типы сообщений у которых процент ошибок при обработке более 5%
.
Цитата Сообщение от TitanKomi Посмотреть сообщение
мы исходим из 100%, в которых есть все сообщения, ... в том числе и необработанные
Я не согласен с такой концепцией, но ничего не стоит написать селект в двух вариантах. Опять берем селект из предыдущей темы ТС и слегка преобразуем
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT type_id, MAX(type_name) type_name, 
       COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END) cnt_suqsess,      --  успешно
       COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END) cnt_error,        --  с ошибкой
       COUNT(DISTINCT CASE WHEN c_st IS NULL THEN id ELSE NULL END) cnt_fail    --  не обработано
       COUNT(*) cnt_all              -- все
FROM (
SELECT q.id, q.c_st, 
       t.c_name type_name         -- это тоже алиас
       t.id type_id               -- это тоже алиас
FROM qry_queue q,
     qry_type  t
WHERE q.c_qry_type = t.id
) GROUP BY type_id
   HAVING COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END)/COUNT(*) > 0.05
ORDER BY type_name;
Но я считаю, что в HAVING надо написать
COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END)/(COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END)+COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END))
Здесь, правда, может сидеть одна засада, когда оба count в знаменателе обращаются в нуль. Чтобы избежать этой засады надо еще решить, куда мы относим подобные типы: к >0.05 или к <0.05. Это чисто наше волевое решение - как мы будем разрешать неопределенность 0/0. Тогда можно написать чуток по-другому
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT type_id, type_name FROM (
SELECT type_id, MAX(type_name) type_name, 
       COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END) cnt_suqsess,      --  успешно
       COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END) cnt_error,        --  с ошибкой
       COUNT(DISTINCT CASE WHEN c_st IS NULL THEN id ELSE NULL END) cnt_fail    --  не обработано
       COUNT(*) cnt_all              -- все
FROM (
SELECT q.id, q.c_st, 
       t.c_name type_name         -- это тоже алиас
       t.id type_id               -- это тоже алиас
FROM qry_queue q,
     qry_type  t
WHERE q.c_qry_type = t.id
) GROUP BY type_id
) WHERE  CASE WHEN cnt_error+cnt_suqsess = 0 THEN  0  -- или 1, в зависимости от того, как мы интерпретируем этот случай
       ELSE  cnt_error/(cnt_error+cnt_suqsess)  END  > 0.05
ORDER BY type_name;
Добавлено через 5 минут
Цитата Сообщение от TitanKomi Посмотреть сообщение
Сколько сообщений в разрезе абонентов было получено за рабочий день
Цитата Сообщение от TitanKomi Посмотреть сообщение
запрос отображает нам имя абонента и кол-во всех сообщений за день
Не за день, а за рабочий день
Рабочие дни теоретически могут быть в разные дни недели. Поскольку не конкретизируется суббота и воскресенье, то считаем, что там тоже рабочее время с 9:00 до 18:00. За каждый рабочий день (их может быть много) отбираются сообщения, пришедшие в рабочее время. И суммируются по всем рабочим дням.
Известный прием v_date - trunc(v_date) позволяет собрать все интервалы по разным дням

Добавлено через 7 минут
Опять же берем из предыдущей темы, исправляем замеченные ошибки и чуть-чуть меняем
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT nn, c_name, cnt 
FROM (
SELECT c_name, COUNT(*) cnt,
       ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) nn
FROM (
SELECT q.id, q.c_exec_tyme, q.c_st, a.c_name
FROM qry_queue q,
     qry_type  t,
     st_abonents a
WHERE q.c_qry_type = t.id
  AND t.c_ab_ref  = a.id 
) GROUP BY c_name
) WHERE nn <=3
ORDER BY nn;
И опять же, если хотим TOP по каким-то другим параметрам, заменяем count(*) на нужный count ( в двух местах). Ну а если хотим TOP 4, то 3 заменяем на 4. А если хотим максимальное значение, то 3 заменяем на 1
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2016, 18:22
Помогаю со студенческими работами здесь

Выборка данных из нескольких таблиц
Есть две таблицы. Одна хранит в себе список объектов(поля: object_id,object_name). Вторая - список статусов данных...

Выборка из нескольких таблиц одновременно
Можно ли выбрать данные из нескольких таблиц одновременно? Что-то типа 'Select * from Tab1, Tab2, ... TabN'

Выборка из двух таблиц
Есть две таблицы вида как на фото. Требуется во второй таблице найти значение совпадающие с первой по ord_id и marka столбцы обоих таблиц...

Выборка из двух таблиц
Добрый день Делаю программку, нужно следующее: выбрать из таблиц заболевания и прививки записи соответствующие определенному...

Выборка из двух таблиц
Всем привет. Есть 2 запроса: sSQL_M = &quot;SELECT a.CRAYP3, a.MFIFP3 AS MARGA &quot; &amp; _ &quot;FROM B31SDFH.FHPSTP03 a &quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru