использовать некоторое значение по умолчанию в арифметической операции, если строка не найдена

0

У меня есть две таблицы:

booking(advertiser_id,  name, bookings, on_date)
click(advertiser_id, name, clicks, on_date)

Мне нужно найти bookings/clicks для каждого name, advertiser_id-мудрый и по дате. Для этого я делал следующее:

select b.name, b.advertiser_id, max(b.bookings)/max(c.clicks), b.on_date from click c inner join booking b on 
    c.advertiser_id = b.advertiser_id and 
    c.name = b.name and
    c.on_date = b.on_date
group by
    b.name,
    b.advertiser_id,
    b.on_date

Мне нужно вернуть 0, если для этого конкретного клика нет заказов (нет записи в таблице бронирования). Как я могу это достичь?

Пример:

таблица click:

name clicks on_date    advertiser_id
uk   123    2018-05-01 12
us   123    2018-05-02 12
us   123    2018-05-01 12

таблица booking:

advertiser_id name bookings on_date
12            uk   1200     2018-05-07 
12            us   123      2018-05-07
12            uk   123      2018-05-01
12            us   123      2018-05-01

Результат:

name advertiser_id max(b.bookings)/max(c.clicks) on_date
uk   12            1.0000                        2018-05-01
us   12            1.0000                        2018-05-01

Ожидаемое:

name advertiser_id max(b.bookings)/max(c.clicks) on_date
uk   12            1.0000                        2018-05-01
us   12            1.0000                        2018-05-01
us   12            0                             2018-05-02

Заметка

Я использовал max для использования столбцов, отсутствующих в group by.

  • 0
    рекламодатель может разместить свою рекламу в разных странах в разные даты. в этом случае нет первичного ключа.
  • 0
    без проблем!! :)
Теги:
database

2 ответа

1
Лучший ответ

Что-то думать о...

DROP TABLE IF EXISTS click;

CREATE TABLE click
(name CHAR(2) NOT NULL
,clicks INT NOT NULL
,on_date DATE NOT NULL
,advertiser_id INT NOT NULL
,PRIMARY KEY(name,on_date,advertiser_id)
);

INSERT INTO click VALUES
('uk',123,'2018-05-01',12),
('us',123,'2018-05-02',12),
('us',123,'2018-05-01',12);


DROP TABLE IF EXISTS booking;

CREATE TABLE booking 
(advertiser_id INT NOT NULL
,name CHAR(2) NOT NULL
,bookings INT NOT NULL
,on_date DATE NOT NULL
,PRIMARY KEY(advertiser_id,name,on_date)
);

INSERT INTO booking VALUES
(12,'uk',1200,'2018-05-07'),
(12,'us', 123,'2018-05-07'),
(12,'uk', 123,'2018-05-01'),
(12,'us', 123,'2018-05-01');


select c.name
     , c.advertiser_id
     , COALESCE(b.bookings,0)
     , c.clicks
     , c.on_date 
  from click c 
  left
  join booking b 
    on c.advertiser_id = b.advertiser_id 
   and c.name = b.name 
   and c.on_date = b.on_date;

+------+---------------+------------------------+--------+------------+
| name | advertiser_id | COALESCE(b.bookings,0) | clicks | on_date    |
+------+---------------+------------------------+--------+------------+
| uk   |            12 |                    123 |    123 | 2018-05-01 |
| us   |            12 |                    123 |    123 | 2018-05-01 |
| us   |            12 |                      0 |    123 | 2018-05-02 |
+------+---------------+------------------------+--------+------------+   
  • 0
    я знаю о coalesce , но как использовать его в арифметической операции?
  • 0
    COALESCE (b.bookings / c.clicks, 0) x
Показать ещё 7 комментариев
0

Вы можете сделать это с помощью LEFT JOIN, поэтому ваш запрос должен выглядеть так,

select C.name,c.advertiser_id, IFNULL(max(b.bookings)/max(c.clicks), 0),c.on_date
FROM click c
LEFT join booking b on
   c.advertiser_id = b.advertiser_id and 
   c.name = b.name and
   c.on_date = b.on_date
group by
   b.name,
   b.advertiser_id,
   b.on_date

И он отлично работает.

Откройте LINK, чтобы увидеть выход.

  • 0
    да, я использовал внешнее соединение, чтобы решить это, спасибо :)
  • 0
    параметры в select и groupby различны, поэтому в моей системе это select c.name,c.advertiser_id, IFNULL(max(b.bookings)/max(c.clicks), 0),c.on_date FROM click c LEFT join booking b on c.advertiser_id = b.advertiser_id and c.name = b.name and c.on_date = b.on_date group by c.name, c.advertiser_id, c.on_date ошибку, поэтому я сделал: select c.name,c.advertiser_id, IFNULL(max(b.bookings)/max(c.clicks), 0),c.on_date FROM click c LEFT join booking b on c.advertiser_id = b.advertiser_id and c.name = b.name and c.on_date = b.on_date group by c.name, c.advertiser_id, c.on_date
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню