SQL Sum булевы значения и добавить итоговую строку - PullRequest
1 голос
/ 18 апреля 2019

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

Основная проблема в том, что я не знаю, как работать с типом BOOLEAN. Пробовал использовать SUM(CASE WHEN was_showed = 'TRUE' THEN 1 ELSE 0 END) но когда я попробовал это только для table1, он возвращал "3" во всех случаях ... когда именно это должно быть "6"

Первая таблица1

id  was_showed
1   FALSE
2   TRUE
3   TRUE
4   TRUE
5   TRUE
6   FALSE
7   TRUE
8   TRUE
9   TRUE

вторая таблица2

id  category
1   test1
2   test2
3   test1
4   test1
5   (null)
6   (null)
7   test1
8   test2
9   test2

третья таблица3

id  was_bought
2   TRUE
4   TRUE
5   TRUE
7   TRUE

Результат, который я хочу получить по категориям:

category | sum(was_showed) | sum(was_bougth)/sum(was_showed)
test1    |   3             |     2/3                 
test2    |   2             |     1/3
NULL     |   1             |      1

последняя строка должна быть:

all | sum(was_showed) by all rows | sum(was_bougth)/sum(was_showed) by all rows

ОБНОВЛЕНИЕ: SQL Fiddle

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Если это tinyint s, вы можете просто добавить их. Для получения итога требуется некоторая хитрость:

select coalesce(x.category, c.category) as category,
       sum(s.was_showed) as shown,
       sum(b.was_bought) as was_bought,
       sum(b.was_bought) / sum(s.was_showed) 
from table2 c left join-- categories
     table1 s
     on s.id = c.id left join -- shown (showed?)
     table3 b
     on b.id = c.id cross join
     (select null as category union all
      select 'total' as category
     ) x
group by coalesce(x.category, c.category)
order by (x.category is null) desc, c.category;

Здесь - это скрипта SQL.

Или вы можете использовать with rollup:

select c.category,
       sum(s.was_showed) as shown,
       sum(b.was_bought) as was_bought,
       sum(b.was_bought) / sum(s.was_showed) 
from table2 c left join-- categories
     table1 s
     on s.id = c.id left join -- shown (showed?)
     table3 b
     on b.id = c.id 
group by c.category with rollup;

И SQL Fiddle для этого.

1 голос
/ 18 апреля 2019

Возможно, вам нужен следующий запрос:

select
  *, 
  1.0 * bought / shown
from (
  select
    c.category,
    sum(case when s.was_showed = 1 then 1 end) as shown,
    sum(case when b.was_bought = 1 then 1 end) as bought
  from adShowCategoryTable c -- categories
  left join adShowsTable s on s.id = c.id -- shown (showed?)
  left join adClicksTable b on b.id = c.id -- bought
  group by c.category
) x
order by category

Пример SQL Fiddle

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