SQL изменить подзапрос для присоединения - PullRequest
0 голосов
/ 28 мая 2020

У меня есть следующий запрос, в котором есть подзапрос. Мне нужен подзапрос, преобразованный в соединение с выделенным предложением «где» для дат, которое будет параметризовано в таблице Excel.

    select me.id, me.merchant_num, me.merchant_nm,
    (select count(1) from transaction_t where merchant_id = me.id and transaction_dt BETWEEN '2020-04-01' and '2020-04-30') as num_transactions
    FROM merchant_t me
    left outer join transaction_t tt on tt.merchant_id = me.id
    where me.status = 'T'

Подзапрос получает количество всех транзакций продавца между данные даты. Я перепробовал все, что мог придумать, но либо получаю слишком много строк, либо что-то другое не так.

Здесь задействованы две таблицы:

merchant_t
----------
id     merchant_num    merchant_nm    status


transaction_t
--------------
id     merchant_id     transaction_dt

Ответы [ 4 ]

1 голос
/ 28 мая 2020

Используйте запрос ниже,

select me.id, me.merchant_num, me.merchant_nm, qry.num_transactions from merchant_t me
left outer join (select merchant_id, count(1) as  num_transactions from transaction_t where transaction_dt BETWEEN '2020-04-01' and '2020-04-30' group by merchant_id) qry
on (me.id = qry.merchant_id)
where me.status = 'T';

Вы также можете использовать запрос ниже,

select me.id, me.merchant_num, me.merchant_nm, qry.num_transactions, count(1) from merchant_t me
 left outer join transaction_t qry
on (me.id = qry.merchant_id)
where me.status = 'T'
group by me.id, me.merchant_num, me.merchant_nm, qry.num_transactions;
1 голос
/ 28 мая 2020

Это должно работать:

    SELECT me.id, me.merchant_num, me.merchant_nm, count(1) as num_transactions
    FROM merchant_t me
    LEFT OUTER JOIN transaction_t
         ON t.merchant_id = me.id 
         AND t.transaction_dt BETWEEN '2020-04-01' and '2020-04-30'
    WHERE me.status = 'T'
    GROUP BY me.id, me.merchant_num, me.merchant_nm
1 голос
/ 28 мая 2020

Вы можете попробовать это ниже logi c -

select me.id, 
me.merchant_num, 
me.merchant_nm,
count(tt.merchant_id) as num_transactions
FROM merchant_t me
left outer join transaction_t tt 
    on tt.merchant_id = me.id
    and tt.transaction_dt BETWEEN '2020-04-01' and '2020-04-30'
    and me.status = 'T'
group by me.id, 
me.merchant_num, 
me.merchant_nm
0 голосов
/ 28 мая 2020

Ваш запрос действительно в порядке. . . почти. У вас есть ненужный JOIN во внешнем запросе:

select me.id, me.merchant_num, me.merchant_nm,
      (select count(1)
       from transaction_t
       where t.merchant_id = me.id and
             t.transaction_dt between '2020-04-01' and '2020-04-30'
     ) as num_transactions
from merchant_t me
where me.status = 'T';

Хотя вы запрашиваете left join, эта версия, вероятно, будет иметь лучшую производительность (с индексом transact_t(merhant_id, transaction_dt), потому что она позволяет избежать внешняя агрегация.

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