Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:Can';t从嵌套选择中引用列_Sql_Postgresql - Fatal编程技术网

PostgreSQL:Can';t从嵌套选择中引用列

PostgreSQL:Can';t从嵌套选择中引用列,sql,postgresql,Sql,Postgresql,我正在尝试编写一个包含嵌套的SELECT的查询。但是,当我尝试运行代码时,Postgres会抛出此错误:错误:bo_wins.opportunity_id列不存在。以下是查询: SELECT b.owner_id AS "Owner ID", COUNT(DISTINCT bo.id) AS "Number of Opportunities", COALESCE(bo_wins.count, 0) AS "Number of Wins" FROM bookings b

我正在尝试编写一个包含嵌套的
SELECT
的查询。但是,当我尝试运行代码时,Postgres会抛出此错误:
错误:bo_wins.opportunity_id列不存在
。以下是查询:

SELECT b.owner_id AS "Owner ID",
       COUNT(DISTINCT bo.id) AS "Number of Opportunities",
       COALESCE(bo_wins.count, 0) AS "Number of Wins"
FROM bookings b
INNER JOIN booking_opportunities bo ON bo.id = b.opportunity_id
LEFT JOIN (
     SELECT b.owner_id AS "Owner ID", COUNT(DISTINCT bo.id) AS "count"
     FROM bookings b 
     INNER JOIN booking_opportunities bo ON bo.id = b.opportunity_id 
     WHERE bo.state IN ('won') AND TO_CHAR(bo.created_at, 'yyyy-mm') = '2016-06' 
     GROUP BY b.owner_id
     ) AS bo_wins ON bo_wins.opportunity_id = b.opportunity_id
WHERE TO_CHAR(bo.created_at, 'yyyy-mm') = '2016-06'
GROUP BY bo_wins.count, b.owner_id;
希望有人能帮助我。我需要做子查询的原因是因为我们的数据库是如何构造的(我知道!不是很有效,是吗?)


编辑:我在子查询中为我的
计数设置了别名。我还是犯了同样的错误

更新答案

我认为你想做的事情最好用这种方式来表达:

SELECT
    b.owner_id AS owner_id,
    COUNT(DISTINCT bo.id) AS opportunities,
    COUNT(DISTINCT CASE WHEN bo.state = 'won' THEN bo.id END) AS wins
FROM
    bookings b 
INNER JOIN
    booking_opportunities bo
    ON (bo.id = b.opportunity_id)
WHERE
    TO_CHAR(bo.created_at, 'yyyy-mm') = '2016-06' 
GROUP BY
    b.owner_id;
这将为您提供每个
所有者id
的机会数和获胜数


初始答案

您需要为您的计算提供一个别名,并且需要在同一select语句中包含
opportunity\u id

COUNT(不同的bo.id)作为“COUNT”


此外,在您的
分组中,您需要将
bo.wins.count
更改为
bo\U wins.count
更新的答案

我认为你想做的事情最好用这种方式来表达:

SELECT
    b.owner_id AS owner_id,
    COUNT(DISTINCT bo.id) AS opportunities,
    COUNT(DISTINCT CASE WHEN bo.state = 'won' THEN bo.id END) AS wins
FROM
    bookings b 
INNER JOIN
    booking_opportunities bo
    ON (bo.id = b.opportunity_id)
WHERE
    TO_CHAR(bo.created_at, 'yyyy-mm') = '2016-06' 
GROUP BY
    b.owner_id;
这将为您提供每个
所有者id
的机会数和获胜数


初始答案

您需要为您的计算提供一个别名,并且需要在同一select语句中包含
opportunity\u id

COUNT(不同的bo.id)作为“COUNT”


此外,在您的
分组中,您需要将
bo.wins.count
更改为
bo\U wins.count
您应该为count添加别名(不同的bo.id)

您应该为count添加别名(不同的bo.id)

您根本没有选择派生表中名为
bo\u wins
opportunity\u id
列。当我进行
计数时,我该怎么做?@DavidBentzon Ehlers-如果您试图以所有者粒度聚合胜利,那么为什么要加入
opportunity\u id
?这就是解决方案。这可能是我第三次使用嵌套选择,因此我犯了这样的新手错误。谢谢您根本没有在派生表中选择名为
bo\u-wins
的列
opportunity\u-id
。当我进行
计数时,我该怎么做?@DavidBentzon-Ehlers-如果您试图在所有者粒度上聚合胜利,那么为什么要加入
opportunity\u-id
?这就是解决方案。这可能是我第三次使用嵌套选择,因此我犯了这样的新手错误。谢谢当我进行计数时,我应该如何包括
opportunity\u id
?@DavidBentzon Ehlers-你不只是想得到每个
所有者\u id
的机会数和赢家数吗?如果是这样的话,我的最新答案为您提供了解决方案。当我进行计数时,我应该如何包括
opportunity\u id
?如果是这样,我的更新答案将为您提供该解决方案。