Сводный доход пользователей по месяцам в PostgreSQL

#postgresql #pivot #crosstab #coalesce

#postgresql #сводная #перекрестная таблица #объединить

Вопрос:

При написании моего запроса в PostgreSQL у меня следующий синтаксис ниже. Этот запрос работает просто отлично. Моя единственная проблема — это значения null, которые отображаются ниже.

Я хочу использовать Coalesce() в этом запросе, но я застрял. Есть ли способ настроить этот запрос, чтобы я мог добавить Coalesce к этому запросу?

 -- Import tablefunc
CREATE EXTENSION IF NOT EXISTS tablefunc;

SELECT * FROM CROSSTAB($
  SELECT
    user_id,
    DATE_TRUNC('month', order_date) :: DATE AS delivr_month,
    SUM(meal_price * order_quantity) :: FLOAT AS revenue
  FROM meals
  JOIN orders ON meals.meal_id = orders.meal_id
 WHERE user_id IN (0, 1, 2, 3, 4)
   AND order_date < '2018-09-01'
 GROUP BY user_id, delivr_month
 ORDER BY user_id, delivr_month;
$)
-- Select user ID and the months from June to August 2018
AS ct (user_id INT,
       "2018-06-01" FLOAT,
       "2018-07-01" FLOAT,
       "2018-08-01" FLOAT)     
ORDER BY user_id ASC;
 

Вывод:

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

Ответ №1:

 SELECT 
       user_id,
       coalesce("2018-06-01", 0.0) "2018-06-01",
       coalesce("2018-07-01", 0.0) "2018-07-01",
       coalesce("2018-08-01", 0.0) "2018-08-01"
 FROM CROSSTAB($
  SELECT
    user_id,
    DATE_TRUNC('month', order_date) :: DATE AS delivr_month,
    SUM(meal_price * order_quantity) :: FLOAT AS revenue
  FROM meals
  JOIN orders ON meals.meal_id = orders.meal_id
 WHERE user_id IN (0, 1, 2, 3, 4)
   AND order_date < '2018-09-01'
 GROUP BY user_id, delivr_month
 ORDER BY user_id, delivr_month;
$)
-- Select user ID and the months from June to August 2018
AS ct (user_id INT,
       "2018-06-01" FLOAT,
       "2018-07-01" FLOAT,
       "2018-08-01" FLOAT)     
ORDER BY user_id ASC;
 

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

1. Извините, моя ошибка. После «2018-08-01» была лишняя запятая, теперь удалена