SQL Несколько счетов с 3 таблицами - PullRequest
0 голосов
/ 29 января 2019

Я строю программу (COBOL), используя SQL для отслеживания зарегистрированного времени для особого времени пользователей.

У меня есть 3 таблицы:

table 1 - user logged time
table 2 - user logged time
table 3 - user profile

Этот же пользовательне в таблице 1 и таблице 2, и все пользователи находятся в таблице 3.

Мне нужно подсчитать, сколько пользователей с профилем X в последний раз вошли в систему, когда вошли в систему: меньше, чемчас между 1 часом и 5 часами больше чем 5 часов.

Я нашел способ сделать 1 подсчет, используя таблицы 1 и 3, с запросом:

`SELECT COUNT (DISTINCT A.user)                                                           
 FROM table1 A                         
LEFT JOIN table3 B                        
   ON B.user = A.user                             
WHERE B.profile = 'X'                                                      
  AND A.HTIMEST = (SELECT MAX(HTIMEST)                    
                     FROM table1 A     
                    WHERE B.user = A.user)                     
  AND A.time BETWEEN 0 AND 1  `     

Bt, что будет значить многозапросов только в одной программе.

Если бы вы могли помочь, я был бы очень благодарен.

Спасибо.

Table1:
       User  TimeLog     Timestamp
        1      0,5       2019-01-01
        1       6        2018-11-31
        4       2        2018-12-31

 Table2:
       User  TimeLog     Timestamp
        2      0,5       2019-01-01
        3       6        2018-11-31
        5       2        2018-12-31

 Table3:
       User  Profile    
        1        X     
        2        X      
        3        Z
        4        X      
        5        Z

Ожидаемый результат:

Time loged   Count
<1h            2 (User 1 e User 2)
>1h -<5h       1 (User 4) (User 5 doesn't have the right profile)
>5h            0 (User 3 doesn't have the right profile, and user 1 has more 
                   recent data)

1 Ответ

0 голосов
/ 29 января 2019

Вы можете использовать UNION , чтобы объединить несколько операторов выбора в один результат.

В вашем случае, вероятно, имеет смысл создать VIEW таблицы объединения table1 и table2.

CREATE VIEW logs AS
    SELECT user, timelog, timestamp FROM table1
    UNION ALL
    SELECT user, timelog, timestamp FROM table2;

Затем создайте запрос на основе этого представления, INNER JOIN ( JOIN ссылка ) пользователей с профилем "X", INNER JOIN запрос, которыйполучает наибольшую временную метку для каждого пользователя и использует оператор CASE (в основном if / else) для определения категории времени.Сгруппируйте данные по регистру и посчитайте пользователей.

SELECT
    CASE
        WHEN l.timelog < 1 THEN '<1h'
        WHEN l.timelog <= 5 THEN '>=1h - <=5h'
        ELSE '>5h'
    END AS time_logged,
    COUNT(l.user)
FROM
    logs l
    INNER JOIN table3 u ON
        l.user = u.user
        AND u.profile = 'X'
    INNER JOIN (
        SELECT
            user,
            MAX(timestamp) AS timestamp
        FROM
            logs
        GROUP BY
            user
        ) m ON
            l.user = m.user
            AND l.timestamp = m.timestamp
GROUP BY
    CASE
        WHEN l.timelog < 1 THEN '<1h'
        WHEN l.timelog <= 5 THEN '>=1h - <=5h'
        ELSE '>5h'
    END;

DB Fiddle

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