#mysql #sql #join
Вопрос:
Я пытаюсь объединить два запроса
select s.id , sum(h.val) as [VAL] from identity s inner join price_net h on s.date = h.date and s.num_id = h.num_id and s.rec_type = h.rec_type where s.date = '10/25/21' and s.rec_type = 'D' and s.tier = 'P' group by s.
.
select s.id , sum(h.val) as [VAL] from identity s inner join price_net h on s.date = h.date and s.num_id = h.num_id and s.rec_type = h.rec_type where s.date = '10/26/21' and s.rec_type = 'D' and s.tier = 'P' group by s.
и я хочу, чтобы была одна таблица с одним столбцом для s.id а следующие столбцы-это столбцы VAL для каждой соответствующей даты. Где значение недоступно для передачи s.id в конкретную дату он должен показывать NA.
Комментарии:
1. вы пытаетесь узнать цены за день? а затем сообщите, какая цена максимальная или минимальная?
2. На заметку: Использовать строковые литералы для дат-плохая идея. Один сеанс может быть понятен
'10/25/21'
, а другой может завершиться неудачно в зависимости от настроек региона. Лучше использовать однозначные литералы дат, такие какdate '2021-10-25'
.
Ответ №1:
Я предполагаю, что вы ищете условную агрегацию ( CASE WHEN
внутри функции агрегации).
select i.id, sum(case when i.date = date '2021-10-25' then pn.val end) as val_20211025, sum(case when i.date = date '2021-10-26' then pn.val end) as val_20211026 from identity i join price_net pn on pn.date = i.date and pn.num_id = i.num_id and pn.rec_type = i.rec_type where i.tier = 'P' and i.rec_type = 'D' and i.date in (date '2021-10-25', date '2021-10-26') group by i.id order by i.id;
Комментарии:
1. не уверен, почему, но вместо функции «дата» мне нужно было использовать функцию «приведение», но в целом эта структура работала, спасибо!!
2. Это странно.
date '2021-10-25'
является стандартным литералом даты SQL. MySQL поддерживает это уже целую вечность.DATE
здесь не функция, а ключевое слово, сообщающее СУБД, что следующая строка представляет дату.
Ответ №2:
вы можете использовать случай, когда для обоих критериев
select s.id , sum(CASE WHEN s.date = '10/25/21' THEN h.val eLSE O END) as [VAL] , sum(CASE WHEN s.date = '10/26/21' THEN h.val eLSE O END) as [VAL2] from identity s inner join price_net h on s.date = h.date and s.num_id = h.num_id and s.rec_type = h.rec_type where as.rec_type = 'D' and s.tier = 'P' group by s.ìd