Подзапрос в Postgresql не соответствует ожидаемым данным

#sql #postgresql

#sql #postgresql

Вопрос:

При использовании приведенного ниже запроса я получаю 7 записей из базы данных.

 SELECT pickup_date::date, 
       SUM(CASE WHEN paid ='Yes' THEN price  ELSE 0  END) AS  TotalMoMoPaid 
from requests 
where order_status = 'Done' 
  and payment_mode = 'MoMo' 
  and pickup_date::date >= current_timestamp::date - INTERVAL '7 days' 
GROUP BY pickup_date::date,paid,order_status,price
  

введите описание изображения здесь

Когда один и тот же запрос используется в качестве подзапроса, я получаю 2 записи, которые не соответствуют моим ожиданиям,

 SELECT pickup_date::date,
       sub.TotalMoMoPaid, 
       SUM(CASE WHEN order_status ='Done' THEN price  ELSE 0  END) AS "TotalCashSales" 
from (
  SELECT paid as subPaid,
         order_status as subStatus,
         price as subPrice, 
         SUM(CASE WHEN paid ='Yes' THEN price  ELSE 0  END) AS  TotalMoMoPaid 
  from requests 
  where order_status = 'Done' 
    and payment_mode = 'MoMo' 
    and pickup_date::date >= current_timestamp::date - INTERVAL '7 days' 
  GROUP BY pickup_date::date,subPaid,subStatus,subPrice
) AS sub, requests  
where order_status ='Done' 
  and payment_mode = 'Cash' 
  and pickup_date::date >= current_timestamp::date - INTERVAL '7 days'
GROUP BY sub.TotalMoMoPaid,subPaid,pickup_date::date 
ORDER BY sub.TotalMoMoPaid,pickup_date::date
  

введите описание изображения здесь

Комментарии:

1. Никогда не используйте запятые в FROM предложении. Всегда используйте правильный, явный, стандартный , читаемый JOIN синтаксис. В конце концов, чего бы вы ожидали от декартова произведения, кроме умножения количества строк?

Ответ №1:

Этот запрос должен работать вместо использования подзапросов;

 SELECT pickup_date::date,
       SUM(CASE WHEN payment_mode = 'MoMo' and paid = 'Yes' THEN price  ELSE 0  END) AS TotalMoMoPaid,
       SUM(CASE WHEN payment_mode = 'Cash' and paid = 'Yes' THEN price  ELSE 0  END) AS TotalCashSales
FROM requests 
WHERE order_status = 'Done' 
      and pickup_date::date >= current_timestamp::date - INTERVAL '7 days' 
GROUP BY pickup_date::date,paid,order_status,price
  

Комментарии:

1. Хорошо, конечно, но запрос теперь выводит данные с одинаковыми датами в разных строках, он должен суммироваться для одних и тех же дат. проверьте ссылку ниже ibb.co/qgJsMg5

2. Я думаю, что режим оплаты в group by вызывает это, поэтому я отредактировал запрос. Можете ли вы попробовать новую версию?

3. Спасибо за вашу помощь, это исправлено после того, как я удалил оплаченную, order_status, цену из ГРУППЫ ПО