Могу ли я выбрать *, COUNT (*) в одном запросе? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть таблица посещений

ssn,eno,date
302609074,101,20180215
302609074,102,20181010
302609074,105,20190505
302609074,105,20190506
997600970,103,20190115
997600970,105,20190415
997600970,104,20181212
997600970,104,20181213
874136439,102,20190808
874136439,102,20190910
874136439,102,20191001
874136439,102,20191002

и таблица результатов

ssn,date,scode,dcode,ppay,ipay
302609074,20180215,4002,1001,25,35
302609074,20180215,4006,1003,40,100
302609074,20181010,4002,1001,25,35
302609074,20181010,4006,1003,40,100
302609074,20190505,4002,1001,25,35
302609074,20190506,4006,1003,40,100
997600970,20190115,4001,1002,25,50
997600970,20190115,4001,1003,40,30
997600970,20190115,4004,1004,40,50
997600970,20190415,4002,1004,40,95
997600970,20190415,4003,1005,40,100
997600970,20181212,4004,1001,25,47
997600970,20181213,4004,1001,25,47
874136439,20190808,4002,1002,25,50
874136439,20190808,4002,1003,40,60
874136439,20190910,4002,1004,40,95
874136439,20190910,4002,1005,60,90
874136439,20191001,4003,1002,25,50
874136439,20191002,4003,1002,25,50

Мне нужно получить общее количество посещений в определенном диапазоне дат, и мне нужно объединить посещения и результаты, чтобы получить (например) сумму ipay для результатов в те же даты.

Я получил свой запрос следующим образом:

SELECT X.NumberOfVisits, SUM(Y.ipay) TotalIPay
FROM (  
        (SELECT *, COUNT(*) NumberOfVisits
         FROM visit
         WHERE (vdate >=20190101 AND vdate <=20190331)
        ) X
        JOIN
        (SELECT *
         FROM outcome
        ) Y
        ON (X.vdate = Y.vdate)
    );

И это не работает.

Если я разделю запрос на отдельные запросы:

SELECT X.OverallNumberOfVisits
FROM (  
        (SELECT COUNT(*) OverallNumberOfVisits
         FROM visit
         WHERE (vdate >=20190101 AND vdate <=20190331)
        ) X
     );

и

SELECT SUM(Y.ipay) TotalIPay
FROM (  
        (SELECT *
         FROM visit
         WHERE (vdate >=20190101 AND vdate <=20190331)
        ) X
        JOIN
        (SELECT *
         FROM outcome
        ) Y
        ON (X.vdate = Y.vdate)
    );

Тогда это работает. Но я не хочу этого делать. Я хочу сделать это в одном запросе. Как правильно их комбинировать?

1 Ответ

2 голосов
/ 13 мая 2019

Ваши запросы кажутся слишком сложными - слишком много подзапросов.Если у вас есть идентификатор посещения (то есть первичный ключ в таблице), вы можете сделать:

SELECT COUNT(DISTINCT v.visit_id), SUM(o.ipay) TotalIPay
FROM visit v LEFT JOIN
     outcome o
     ON v.vdate = o.vdate
WHERE v.vdate >= 20190101 AND v.vdate <= 20190331;

Я подозреваю, что вы действительно хотите присоединиться к ssn и vdate,но вы говорите, что ваша версия работает.

Если у вас нет первичного ключа, вы можете сделать:

SELECT MAX(num_visits), SUM(o.ipay) TotalIPay
FROM (SELECT v.*, COUNT(*) OVER () as num_visits
      FROM visit v
      WHERE v.vdate >= 20190101 AND v.vdate <= 20190331
     ) v LEFT JOIN
     outcome o
     ON v.vdate = o.vdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...