Как получить сумму двух разных столбцов из двух разных таблиц и сгруппировать их - PullRequest
2 голосов
/ 29 мая 2020

У меня есть две таблицы, которые я хочу объединить между двумя таблицами и сгруппировать по дате

Первая таблица - fb_data

id  name created_at           revenue
1   as   2020-05-29 19:30:54  5
2   as   2020-05-28 19:30:54  10
3   ad   2020-05-29 19:31:42  6     
4  ad    2020-05-28 19:31:54 65
5  as    2020-05-29 19:32:10 7
6  ad    2020-05-28 19:31:54 5

Вторая таблица - google_data

id name   created_at           sessions
1  as     2020-05-29 19:38:32    5 
2  ad     2020-05-29 19:38:41    10
3  as      2020-05-29 19:38:49   7 
4  as      2020-05-28 19:39:02   6
5  ad     2020-05-28 19:39:13   8
6  ad    2020-05-28 19:41:41   13

Теперь я хочу объединить два столбца по имени, а затем сгруппировать их по created_at. Что-то вроде этого

Name , date(created_at) as date , sum(fb_data.revenue) , sum(google_data.revenue)

У меня есть один запрос sql, но он не дает ожидаемого результата

select gd.name,fb.total_revenue,fb.created_at,gd.total_sessions
from (select date(fb_data.created_at) as created_at, sum(fb_data.revenue) as total_revenue, name
      from fb_data
      group by date(fb_data.created_at), name) fb,
     (select date(google_data.created_at) as created_at, sum(google_data.session) as total_sessions, name
      from google_data
      group by name, date(google_data.created_at)) as gd
      where fb.name = gd.name
      group by  gd.name,fb.name,fb.created_at,gd.total_sessions

Результат, который я получаю:

Name total_revenue   created_at     total_sessions
as   12              2020-05-29     12             
as   12              2020-05-29     6
as   10              2020-05-28     12
as   10              2020-05-28     6    
ad   6               2020-05-29     10
ad   6              2020-05-29      21
ad  70             2020-05-28       10
ad  70             2020-05-28      21

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

name  total_revenue   created_at total_sessions
as    12              2020-05-29   12 
as    10              2020-05-28   6
ad    6               2020-05-29   10
ad    70              2020-05-28   21

Ответы [ 4 ]

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

Эта проблема немного сложнее, чем кажется на первый взгляд.

Вам нужно будет объединить три подзапроса, каждый с одной строкой на имя и дату.

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

        SELECT DISTINCT name, created_at
          FROM (
             SELECT name, DATE(created_at) created_at FROM fb
              UNION
             SELECT name, DATE(created_at) created_at  FROM gg
            ) a

Второй подзапрос получает количество сеансов для каждого имени / даты.

             SELECT name, 
                    DATE(CREATED_AT) created_at, 
                    SUM(sessions) sessions
               FROM gg
              GROUP BY name, DATE(created_at)

Третий делает то же самое для дохода.

             SELECT name, 
                    DATE(CREATED_AT) created_at, 
                    SUM(revenue) revenue
               FROM fb
              GROUP BY name, DATE(created_at)

Затем вы ЛЕВОЙ СОЕДИНЯЕТЕ второй и третий подзапросы с первым подзапросом.

SELECT items.name, items.created_at, sess.sessions, rev.revenue
  FROM (first subquery) items
  LEFT JOIN (second subquery) sess ON items.name = sess.name
                                 AND items.created_at = sess.created_at
  LEFT JOIN (third subquery) rev ON items.name = rev.name
                                AND items.created_at = rev.created_at

Все вместе, вы получаете это .

SELECT items.name, items.created_at, sess.sessions, rev.revenue
  FROM (SELECT DISTINCT name, created_at
          FROM (
             SELECT name, DATE(created_at) created_at FROM fb
              UNION
             SELECT name, DATE(created_at) created_at  FROM gg
            ) a
       ) items
  LEFT JOIN (SELECT name, 
                    DATE(CREATED_AT) created_at, 
                    SUM(sessions) sessions
               FROM gg
              GROUP BY name, DATE(created_at)
            ) sess ON items.name = sess.name
                  AND items.created_at = sess.created_at
  LEFT JOIN (SELECT name, 
                    DATE(CREATED_AT) created_at, 
                    SUM(revenue) revenue
               FROM fb
              GROUP BY name, DATE(created_at)
            ) rev ON items.name = rev.name
                  AND items.created_at = rev.created_at

https://www.db-fiddle.com/f/hiAKaSDWn1FuUufF3oLbgZ/0

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

Попробуйте следующий запрос:

SELECT t.name, t.total_revenue, t.created_at, t2.total_sessions
FROM
  (SELECT name, date(created_at) created_at, sum(revenue) total_revenue
   FROM fb_data
   GROUP BY name,
            date(created_at)) t
INNER JOIN
  (SELECT name, date(created_at) created_at, sum(sessions) total_sessions
   FROM google_data
   GROUP BY name,
            date(created_at)) t2 ON t2.created_at = t.created_at
AND t2.name = t.name;
1 голос
/ 29 мая 2020

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

select gd.name,fb.total_revenue,fb.created_at, max(gd.total_sessions)
from (select date(fb_data.created_at) as created_at, sum(fb_data.revenue) as 
total_revenue, name
  from fb_data
  group by date(fb_data.created_at), name) fb,
 (select date(google_data.created_at) as created_at, sum(google_data.session) as 
total_sessions, name
  from google_data
  group by name, date(google_data.created_at)) as gd
  where fb.name = gd.name
  group by  gd.name,fb.name,fb.created_at;
0 голосов
/ 29 мая 2020

Вы можете использовать простой запрос ниже. Это дает желаемый результат:

select aa.name,aa.created, sum(ses), sum(rev)  
from 
    (select fb_data.name, date(created_at) as created, sum(revenue) as rev, 0 as ses
    from fb_data group by fb_data.name,date(created_at) 
    UNION
    select google_data.name, date(created_at) as created, 0 as rev, sum(sessions) as ses
    from google_data group by google_data.name,date(created_at)
    ) as aa 
group by name,created;

Результаты проверки: https://www.db-fiddle.com/f/7wpGKon7SH58HNF7Q4SuFH/1

...