2016-06-06 2 views
0

У меня есть таблица событий и журнал транзакций. И я хочу подсчитать общий доход каждого события на один sql. Может ли что-нибудь сказать, как это сделать.
, пожалуйста, будьте готовы, в таблице транзакций будет более 100 000 журналов.Используйте данные другой таблицы в postgreSQL

EVENT_TABLE:

Event_id | start_date | end_date 
------------------------ 
11111 | 2013-01-04 | 2013-01-05 
11112 | 2013-01-08 | 2013-01-10 
11113 | 2013-01-11 | 2013-01-12 
11114 | 2013-01-15 | 2013-01-18 
11115 | 2013-01-19 | 2013-01-21 
11116 | 2013-01-22 | 2013-01-24 
11117 | 2013-01-26 | 2013-01-29 

transaction_log:

id | name | time_created | Cost 
    ------------------------ 
    1 | michael | 2013-01-04 | 1 
    2 | michael | 2013-01-08 | 4 
    3 | mary | 2013-01-11 | 5 
    4 | john | 2013-01-15 | 2 
    5 | michael | 2013-01-19 | 3 
    6 | mary | 2013-01-22 | 2 
    7 | john | 2013-01-26 | 4 

Я пытался использовать SQL как следующие, но он не работает.

select 
     event_table.id, 
     (select sum(Cost) 
     from transaction_log 
     where date(time_created) between transaction_log.start_date and transaction_log.end_date) as revenue 
from event_table 
+3

Вам нужно, чтобы описать _how_, это не работает, что вы ожидали и так далее. – renemilk

+0

Я собирался суммировать данные одного стола, используя период времени, заложенный в другой таблице. Я никогда не понимал, что могу использовать «join on (xx between xx)». Решено, спасибо! –

ответ

0

Это не удается, потому что поля start_date и end_date взяты из event_table, но вы о том, как их transaction_log.start_date и transaction_log.end_date. Это будет работать:

select 
     event_table.id, 
     (select sum(Cost) 
     from transaction_log 
     where date(time_created) between event_table.start_date and event_table.end_date) as revenue 
from event_table 

Там нет необходимости бросать time_created как дата (date(time_created)), если она уже типа данных даты. В противном случае, если time_created является временной меткой или timestamptz, то для выполнения вы можете рассмотреть возможность:

select 
     event_table.id, 
     (select sum(Cost) 
     from transaction_log 
     where time_created >= event_table.start_date::timestamptz and time_created < (event_table.end_date+1)::timestamptz) as revenue 
from event_table 

Кроме того, для выполнения, при выполнении запроса, как показано выше, PostgreSQL выполняет подзапрос для каждой строки основных запрос (в этом случае таблица event_table). Присоединение и использование GROUP BY, как правило, обеспечат вам лучшие результаты:

select e.id, sum(l.Cost) as revenue 
from event_table e 
join transaction_log l ON (l.time_created BETWEEN e.start_date AND e.end_date) 
group by e.id 
+0

Я использовал последний запрос, он отлично работает. Я никогда не использовал такой запрос, как a b (b.bb между a.aa и a.ab) действительно потрясающе, спасибо! –

+0

@YuanGao Если удовлетворительно ответил, пожалуйста, пометьте вопрос как ответ, чтобы он больше не привлекал людей, желающих помочь. –