Создайте два столбца СУММАРНОГО значения для двух разных дат отдельно в одном запросе

#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