ОШИБКА: отсутствует запись предложения FROM для таблицы "p" - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь использовать UNION для добавления столбца итогов в первой верхней половине ко второй половине запроса.

SELECT NULL as month, NULL as active, count(cage_player_id) as total
FROM player_signup as p 
GROUP BY date_part('month', p.signup_date)

UNION 

SELECT date_part('month', signup_date) as month, count(DISTINCT(p.cage_player_id)) as active, NULL as total
FROM player_signup as p
JOIN daily_kpis as d ON p.cage_player_id = d.cage_player_id
WHERE slot_bet_amount > 0
OR ld_bet_amount > 0 
OR table_bet_amount > 0 
GROUP BY date_part('month', p.signup_date)
ORDER BY date_part('month', p.signup_date) ASC

Я получаю сообщение об ошибке, в котором говорится, что предложение FROM отсутствует для таблицы p. Кто-нибудь может помочь? Есть ли более простой способ объединить эти два запроса?

Вот как выглядит каждый запрос в отдельности. Я просто хочу добавить итоговый столбец рядом с месяцем и активным столбцом. Полные идентификаторы все равно будут разбиты по месяцам.

Запрос 1

Results

Запрос 2

Results

Ответы [ 2 ]

3 голосов
/ 20 марта 2020

Проблема в предложении order by. Он применяется к результатам запроса union , поэтому он не может видеть идентификаторы, определенные в запросах. Вместо этого вы должны использовать имена столбцов в наборе результатов.

Таким образом, вы хотите изменить это:

ORDER BY date_part('month', p.signup_date) ASC

На:

ORDER BY month
1 голос
/ 20 марта 2020

Я считаю, что это запрос, который вам нужен:

SELECT date_part('month', signup_date) as month
       , count(DISTINCT(p.cage_player_id)) as active
       , (select count(cage_player_id) 
          FROM player_signup as p 
          GROUP BY date_part('month', p.signup_date)) as total
FROM player_signup as p
JOIN daily_kpis as d ON p.cage_player_id = d.cage_player_id
WHERE slot_bet_amount > 0
OR ld_bet_amount > 0 
OR table_bet_amount > 0 
GROUP BY date_part('month', p.signup_date)
ORDER BY date_part('month', p.signup_date) asc

Я не так хорош в Postgresql, пожалуйста, попробуйте это:

SELECT date_part('month', signup_date) as month
       , count(DISTINCT(p.cage_player_id)) as active
       , max(t1.total) as total
FROM player_signup as p
left join (select count(pp.cage_player_id) over (partition by date_part('month', pp.signup_date)) as total
                  , date_part('month', pp.signup_date) date_p
           FROM player_signup as pp) t1 on t1.date_p = date_part('month', p.signup_date)
JOIN daily_kpis as d ON p.cage_player_id = d.cage_player_id
WHERE slot_bet_amount > 0
OR ld_bet_amount > 0 
OR table_bet_amount > 0 
GROUP BY date_part('month', p.signup_date)
ORDER BY date_part('month', p.signup_date)
...