SQL未知列?

问题描述 投票:1回答:4

我是SQL新手,对此查询有困难:

[德克萨斯州每个县的平均海拔,其中包含一个或多个邮政编码,人口超过20,000。

这是我到目前为止所拥有的:

SELECT county, zip_code, state, AVG(elevation) 
FROM zip_codes 
WHERE state=’TX’  
GROUP BY county 
HAVING population > 20000 
ORDER BY county;

错误1054(42S22):'where子句'中的未知列''TX''

但是当我从state数据库中选择zip_codes时,就在那里。

sql oracle having
4个回答
1
投票

解决报价问题是必须的,Littlefoot回答。

但是,您的查询仍然是无效的Oracle SQL,因为:

  • select子句有两个未聚合的列,它们不属于group by子句(zip_codestate

  • population子句中的列having相同,既不是聚合的,也不是group by子句的一部分

为此作业:

[德克萨斯州每个县的平均海拔,其中包含一个或多个邮政编码,人口超过20,000。

假设表中的每个记录对应于一个不同的zip_code(鉴于表本身称为zip_codes,这似乎是相关的,您可以这样说:

select county, state, avg(elevation) avg_elevation
from zip_codes 
where state= 'TX'  
group by county, state 
having max(population) > 20000 
order by county;

3
投票

您正在使用错误单引号。应该是

WHERE state = 'tx'

代替

WHERE state = ’tx’

您是...从哪里来的?某些编辑器(例如MS Word或类似工具)会创建这些“花式”引号。好吧,不要使用它们。

此外,未聚合的列应all成为GROUP BY子句的一部分:

group by county, zip_code, state

0
投票
SELECT county, zip_code, state, AVG(elevation) 
FROM zip_codes 
WHERE state='TX'
GROUP BY county,  zip_code, state 
where population > 20000 
ORDER BY county;

0
投票

没有数据样本,很难准确了解正在发生的事情,但我会对其进行调查。

您的任务表明您要计算“每个德克萨斯州县的平均海拔,其中包含一个或多个邮政编码超过20,000的人口”。让我们分解一下您需要查找的分配元素:

Average elevation
  Of each county in Texas
    Which has one or more zip code
      With population > 20,000

并且我们有一个邮政编码表,包括县,州和海拔。

所以,好的-第一个问题:在德克萨斯州找到所有邮政编码:

SELECT *
  FROM ZIP_CODES
  WHERE STATE = 'TX'

好,到目前为止很容易。现在,将其限制为人口超过20,000的邮政编码:

SELECT *
  FROM ZIP_CODES
  WHERE STATE = 'TX' AND
        POPULATION > 20000

很酷-但这为我们提供了人口> 20000的县中每个邮政编码的条目。我们所关心的是各个县中至少有一个邮政编码超过20K的县。那么

SELECT DISTINCT COUNTY
  FROM ZIP_CODES
  WHERE STATE = 'TX' AND
        POPULATION > 20000

太好了。现在,我们需要计算上述查询返回的每个县的平均海拔:

SELECT COUNTY, AVG(ELEVATION)
  FROM ZIP_CODES
  WHERE STATE = 'TX' AND
        COUNTY IN (SELECT DISTINCT COUNTY
                     FROM ZIP_CODES
                     WHERE STATE = 'TX' AND
                           POPULATION > 20000)
  GROUP BY COUNTY
  ORDER BY COUNTY

还有您的答案。

© www.soinside.com 2019 - 2024. All rights reserved.