У меня есть две таблицы:
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
.
Что-то думать о...
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 |
+------+---------------+------------------------+--------+------------+
coalesce
, но как использовать его в арифметической операции?
Вы можете сделать это с помощью 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, чтобы увидеть выход.
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