Как выбрать значения из одного столбца, используя разные операторы where - SQL

0

У меня есть следующий код.

SELECT
 TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
 count(distinct(a.lead_demand_user_id)) AS Total_Leads
FROM
 leads a
WHERE
 date(a.created_at) BETWEEN '2017-06-01'
 AND 'TODAY' 
 AND a.lead_delivery_time IS NOT NULL
 AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
GROUP BY 1

Вышеприведенный запрос предоставляет ежемесячные лидеры.

Затем у меня есть другой запрос, который предоставляет только "Аренда".

SELECT
 TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
 count(distinct(a.lead_demand_user_id)) AS Rent_Leads
FROM
 leads a
WHERE
 date(a.created_at) BETWEEN '2017-06-01'
 AND 'TODAY' 
 AND a.lead_delivery_time IS NOT NULL
 AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
 AND a.service IN ('Leads::Rent')
GROUP BY 1

Теперь я могу создать два отдельных запроса, однако мне нужно, чтобы оба значения отображались по одному запросу в следующем формате

Месяц → Всего потенциальных клиентов → Аренда потенциальных клиентов

Я попытался использовать, объединить, объединить, подзапрос, но не смог получить нужные данные.

Теги:
group-by
psql

3 ответа

0
Лучший ответ

Как насчет этого:

SELECT t1.Datum AS Month, t1.Total_Leads AS Total, t2.Rent_Leads AS Rent 
FROM (SELECT * FROM (SELECT TO_CHAR(a.created_at, 'YYYY.MM') AS Datum, count(distinct(a.lead_demand_user_id)) AS Total_Leads
                     FROM leads a
                     WHERE date(a.created_at) BETWEEN '2017-06-01'
                     AND 'TODAY' 
                     AND a.lead_delivery_time IS NOT NULL
                     AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')) AS x
      GROUP BY 1         
     ) AS t1
INNER JOIN (SELECT * FROM (SELECT TO_CHAR(b.created_at, 'YYYY.MM') AS Datum, count(distinct(b.lead_demand_user_id)) AS Rent_Leads
                           FROM leads b
                           WHERE date(b.created_at) BETWEEN '2017-06-01'
                           AND 'TODAY' 
                           AND b.lead_delivery_time IS NOT NULL
                           AND b.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
                           AND b.service IN ('Leads::Rent')) AS y
            GROUP BY 1
           ) AS t2
ON t1.Datum = t2.Datum;
  • 0
    Привет спасибо. Я также пробовал этот же запрос ранее в dat, но он показывал следующую ошибку: ОШИБКА: столбец «a.created_at» должен появляться в предложении GROUP BY или использоваться в статистической функции.
  • 0
    TO_CHAR - это пользовательская функция, верно? Попробуйте добавить еще один SELECT * вне подзапроса, чтобы обойти ошибку.
0

Вариантом, который я использовал в этой ситуации, является использование union:

Используйте свой первый запрос как

SELECT
 TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
 count(distinct(a.lead_demand_user_id)) AS Total_Leads, 0 as Rent_leads...

объединяй это со своим вторым, как

SELECT
 TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
 0 as Total_Leads,
 count(distinct(a.lead_demand_user_id)) AS Rent_Leads...

Это работает, но означает, что вы эффективно читаете основную таблицу дважды, альтернативой является использование факта, что NULLS не учитываются. Я предположил, что lead_demand_user_id - это число. В Oracle вы можете использовать Decode(a.service,'Leads::Rent',1,null) чтобы создать либо 1, либо null.then count (distinct(a.lead_demand_user_id)*Decode(a.service,'Leads::Rent',1,null)) as Rent_Leads Я не уверен, что Decode доступен в других SQL.

Надеюсь это поможет

Стивен Л. Ли

0

Попробуй это:

SELECT
   TO_CHAR(a.created_at, 'YYYY.MM') AS Datum,
   count(distinct(a.lead_demand_user_id)) AS Total_Leads,
   sum(case when a.service IN ('Leads::Rent') then 1 else 0 end) AS Rent_Leads
FROM leads a
WHERE date(a.created_at) BETWEEN '2017-06-01'
AND 'TODAY' 
AND a.lead_delivery_time IS NOT NULL
AND a.lead_filler IN ('Android', 'iOS', 'MobileWeb', 'Web')
GROUP BY 1
  • 0
    Привет спасибо. Однако приведенный выше запрос дает синтаксическую ошибку. Ошибка: синтаксическая ошибка или около "ТО"
  • 0
    Я обновил свой ответ. Была скобка
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню