Задавайте вопросы, мы ответим
Вы не зашли.
Необходимо написать запрос результат которого ответит на вопрос: Сколько юзеров на каждом из продуктов в апреле месяце получили рефанд и удалили продукт, получили рефанд и оставили продукт. (С условием, что анинсталл был позже рефанда)?
2 таблицы, по другому не смогла загрузить, увы. изображение не грузится!
user_sales Data_Type user_events Data_Type
user_id INT date DATE
product STRING user_id INT
sum INT event STRING
payment status STRING product STRING
date DATE
Отредактированно yulia (10.02.2018 20:12:39)
Неактивен
Здравствуйте. Не нужно дублировать одинаковые темы.
Приведите структуру таблиц и тестовые данные.
Неактивен
прошу прощения, мне выдавало ошибку при создание темы(
по какой то причине не могу добавить изображение таблицы
Неактивен
Не нужно добавлять изображение, пришлите
show create table
нужных таблиц
и
тестовые данные.
в идеале - создайте тестовый пример на sqlfiddle.com
и пришлите сюда вот как тут:
https://sqlinfo.ru/forum/viewtopic.php?pid=40086#p40086
Неактивен
вариант запроса который я написала. только начала изучать SQL и знакома только с базовыми простыми запросами:
SELECT COUNT (user_sales.user_id)
FROM user_sales
LEFT JOIN user_events ON user_sales.user_id = user_events.user_id, user_sales.product = user_events.product
WHERE user_sales.date = '2016-04'
AND user_sales.payment_status = 'refund'
AND user_events.event = 'uninstall'
AND user_sales.date < user_events.date
GROUP BY user_sales.product
проверить нет возможности, закончился сертификат на офис, а MySQL нету на домашнем компе(((
Неактивен
Воспользуйтесь sqlfiddle.com,
создайте свои таблицы и тестовое наполнение похожее на
http://sqlfiddle.com/#!9/ae8b4/5
и сразу бросается в глаза
LEFT JOIN user_events ON user_sales.user_id = user_events.user_id, user_sales.product = user_events.product
я бы заменил на
LEFT JOIN user_events ON user_sales.user_id = user_events.user_id AND user_sales.product = user_events.product
, Вы же хотите делать объединение этих двух таблиц user_salse и user_events по этим двум критериям сразу?
Неактивен
да, по ним. и еще есть общее значение дата. по которому нужно ограничить период (апрель).
что-то у меня не особо получается на sqlfiddle.com
Неактивен
Отредактированно yulia (10.02.2018 21:17:39)
Неактивен
А какие необходимые условия для того, чтобы товар попал в выборку? Перечислите пожалуйста.
То есть какие записи на конкретный продукт должны присутствовать в таблицах?
И сразу еще вопрос - структура таблиц подлежит изменениям или она задана "сверху"?
А то имхо тут лучше изменить структуру-то..
Это тестовое задание, курсовая или реальная рабочая задача?
Неактивен
Необходимо написать запрос результат которого ответит на вопрос: Сколько юзеров на каждом из продуктов в апреле месяце получили рефанд и удалили продукт, получили рефанд и оставили продукт. (С условием, что анинсталл был позже рефанда)?
это тестовое задание основано на реальной работе. структура таблиц была зада именно такая в самом тестовом задание, потому думаю, что не стоит ее менять. хотя да, не логичная...
результатом должна быть одна таблица. как мне кажется она должна иметь вид (product, refund+uninstall, refund+install) возможно еще date, но не обязательно. если запрос уже будет ограничен одним месяцем (апрелем). да и в задание не указано, что информация нужна по дням.
больше всего смущает условие в скобках. как его указать понятия не имею((
Отредактированно yulia (10.02.2018 21:59:48)
Неактивен
Подозреваю, что что-то такое, но совершенно не уверен - мало данных для анализа. Вы не ответили
на А какие необходимые условия для того, чтобы товар попал в выборку? Перечислите пожалуйста.
То есть какие записи на конкретный продукт должны присутствовать в таблицах?
Неактивен
а зачем условие count(...) > 0 ?
оно ведь не кол-во юзеров будет считать, а факт их наличия (0 или 1)
Неактивен
user_sales (user_id, product, payment status, date)
user_events (date, user_id, event, product)
одна строка - это один юзер. то есть нужно за месяц(апрель) выбрать все данные. а потом подсчитать количество юзеров у которых будет совпадать условия:
user_sales.payment_status - refund и user_events.event - uninstall;
user_sales.payment_status - refund и user_events.event - install.
Отредактированно yulia (10.02.2018 22:45:24)
Неактивен
vasya написал:
а зачем условие count(...) > 0 ?
оно ведь не кол-во юзеров будет считать, а факт их наличия (0 или 1)
Да, это я погорячился, скорее так
Неактивен
вопрос к дате.
как именно ее задать?
WHERE user_sales.date = '2016-04'
или
WHERE user_sales.date>= '2016-04-01' AND DATE <= '2016-04-30'
или
WHERE user_sales.date BETWEEN '2016-04-01' AND '2016-04-30'
Неактивен
'2016-04' так точно нельзя, остальные варианты можно.
Неактивен
deadka написал:
vasya написал:
а зачем условие count(...) > 0 ?
оно ведь не кол-во юзеров будет считать, а факт их наличия (0 или 1)Да, это я погорячился, скорее так
SELECT
s.product
,count(distinct s.`payment_status` = 'refund' AND e.`event` = 'uninstall' AND s.`date` < e.`date`)
,count(distinct s.`payment_status` = 'refund' AND e.`event` = 'install' AND s.`date` < e.`date`)
FROM
`user_sales` s
JOIN `user_events` e ON s.`user_id` = e.`user_id` AND s.`product` = e.`product`
GROUP BY
s.`product`;
Ну и добавьте WHERE перед GROUP BY чтобы по дате отфильтровать.
distinct - чтобы дубли не считались.
вопрос!!!
а зачем скобки на название колонок?
и почему просто JOIN, а не LEFT JOIN?
дату нужно указывать в формате #07/04/1996# или '07/04/1996'?
Отредактированно yulia (10.02.2018 23:51:51)
Неактивен
смотрю на запрос и меня смущает один момент
SELECT
s.product
а не должно ли быть
SELECT
s.user_id ?
мы ж по продукту разбиваем в
GROUP BY
s.`product`
Неактивен
yulia написал:
смотрю на запрос и меня смущает один момент
SELECT
s.product
а не должно ли быть
SELECT
s.user_id ?
ну, вы ведь сами написали, что
yulia написал:
результатом должна быть одна таблица. как мне кажется она должна иметь вид (product, refund+uninstall, refund+install)
Неактивен
yulia написал:
а зачем скобки на название колонок?
и почему просто JOIN, а не LEFT JOIN?
дату нужно указывать в формате #07/04/1996# или '07/04/1996'?
Что значит скобки на название колобок? символ `, которым обрамляю имена колонок это просто принятые правила оформления mysql-кода, давайте так считать.
JOIN - потому что нас вроде как интересуют только те продукты, у которых был uninstall.
Дата указывается в YYYY-MM-DD.
Неактивен
deadka написал:
yulia написал:
а зачем скобки на название колонок?
и почему просто JOIN, а не LEFT JOIN?
дату нужно указывать в формате #07/04/1996# или '07/04/1996'?Что значит скобки на название колобок? символ `, которым обрамляю имена колонок это просто принятые правила оформления mysql-кода, давайте так считать.
JOIN - потому что нас вроде как интересуют только те продукты, у которых был uninstall.
Дата указывается в YYYY-MM-DD.
На сколько я помню, в MySQL - который стационарный, при вводе названия колонки, ' - не появляется. Такой вариант написания я увидела в sqlfiddle.com, который вы посоветовали, кстати большое спасибо, это очень облегчит обучение в дальнейшем.
Не думайте, я не сомневаюсь в ваших знаниях, я просто хочу не тупо получить решение, а понять почему это должно быть именно так. И не будет ли это ошибкой, отдать решение с ' ?
JOIN- нас интересуют продукты у которых был только refund! В комбинации с uninstall и install. Но только с комбинацией uninstall нам нужно учитывать условие которое прописано в скобках (С условием, что анинсталл был позже рефанда). То есть условие с датой нужно толь в первом ?
Отредактированно yulia (11.02.2018 11:14:03)
Неактивен
vasya написал:
yulia написал:
смотрю на запрос и меня смущает один момент
SELECT
s.product
а не должно ли быть
SELECT
s.user_id ?ну, вы ведь сами написали, что
yulia написал:
результатом должна быть одна таблица. как мне кажется она должна иметь вид (product, refund+uninstall, refund+install)
подскажите, а таблица будет выглядеть вот так?
Отредактированно yulia (11.02.2018 11:17:06)
Неактивен
не понял последний вопрос.
переформулируйте или лучше проиллюстрируйте на примере о чем идет речь
Неактивен
Неактивен
yulia написал:
правильно ли я использовала фyнкцию AS?
в таблице которая получиться после запроса будет три колонки, правильно?
(product, refund_uninstall, refund_install)
Да.
Неактивен