【问题标题】:ERROR: missing FROM-clause entry for table "p"错误:表“p”缺少 FROM 子句条目
【发布时间】:2020-03-20 16:16:43
【问题描述】:

我正在尝试使用 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

我不断收到错误消息,提示表 p 缺少 FROM 子句。任何人都可以帮忙吗?有没有更简单的方法来组合这两个查询?

这是每个查询分别显示的样子。我只想在月份和活动列旁边添加总计列。总 ID 仍将按月细分。

查询 1

查询 2

【问题讨论】:

    标签: sql postgresql sql-order-by union sql-insert


    【解决方案1】:

    问题在于order by 子句。它适用于 union 查询的 results,因此它看不到查询中定义的标识符。相反,您应该使用结果集中列的名称。

    所以你想改变这个:

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

    收件人:

    ORDER BY month
    

    【讨论】:

      【解决方案2】:

      我相信这是您需要的查询:

      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)
      

      【讨论】:

      • 我收到一个错误,上面写着“错误:用作表达式的子查询返回了不止一行”:/
      • 嗨@luna_27 我已经更新了我的答案。希望它会有所帮助。
      • 嗨@luna_27 请记住这一点:stackoverflow.com/help/someone-answers 我不是因为我的回答而告诉你,而是因为这里和你之前的问题中的其他答案,以及因为未来......干杯
      • 嗨@luna_27 我的第二个查询是否符合您的要求?
      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多