2013-11-23 200 views
2

我试图计算害虫的谁使用作物的同一品种一个城市的平均数量..的Sql计算平均

DistrictName | TownName   | CropName |Pests 
Rawalpindi  | pindi    | CIM 506  | 3.3  
Rawalpindi  | pindi    | CIM 506  | 3.8  
Rawalpindi  | Muree    | CIM 506  | 3.5 

但此查询不断给我的语法错误,即无效列名PestPopulation1凡为我彻底检查我的列名的拼写... PestPopuplationvarchar(max)

下面的是我的查询

SELECT T.DistrictName, T.TownName, T.VarietyOfCrop, avg(T.PestPopulation1) 
FROM (
    SELECT DistrictName, TownName,VarietyOfCrop, cast(PestPopulation1 as float) as Pests 
    FROM FinalTable2 
) as T 
group by T.DistrictName, T.TownName, T.VarietyOfCrop 

回答

4

如前所述,问题在于您引用了该范围内不可用的列。

总的来说,甚至没有一个很好的理由来使用这样一个人为的查询。这应该工作一样好,而且是更具可读性:

SELECT T.DistrictName, T.TownName, T.VarietyOfCrop, avg(cast(T.Pests as float)) 
FROM FinalTable2 T 
group by T.DistrictName, T.TownName, T.VarietyOfCrop 
+0

将数据类型nvarchar转换为float时出错。它给了我这个错误......我的Pest列在varchar max中 – user1056466

0

试试这个

SELECT T.DistrictName, T.TownName, T.VarietyOfCrop, avg(T.PestPopulation1) 
FROM (
    SELECT DistrictName, TownName,VarietyOfCrop, cast(Pests as float) as PestPopulation1 
    FROM FinalTable2 
) as T 
group by T.DistrictName, T.TownName, T.VarietyOfCrop 
4

这给你一个错误的原因是因为你给了表达cast(PestPopulation1 as float)别名Pests

您应该使用别名在外部查询,像这样:

SELECT T.DistrictName, T.TownName, T.VarietyOfCrop, avg(T.Pests) 
FROM (
    SELECT DistrictName, TownName,VarietyOfCrop, cast(PestPopulation1 as float) as Pests 
    FROM FinalTable2 
) as T 
group by T.DistrictName, T.TownName, T.VarietyOfCrop 

您应该能够通过推动cast简化此查询到avg,像这样:

SELECT 
    DistrictName 
, TownName 
, VarietyOfCrop 
, avg(convert(float, PestPopulation1)) as avg_pests 
FROM FinalTable2 
group by T.DistrictName, T.TownName, T.VarietyOfCrop 

将数据类型nvarchar转换为float时出错。我的PestPopulation1列中的varchar(max)

您需要使用CONVERT而不是CAST(参见上文)。

+0

将数据类型nvarchar转换为float时出错。它给了我这个错误...我的Pest列的varchar max - – user1056466

+0

@ user1056466然后使用'convert'而不是'cast'。 – dasblinkenlight

+0

错误没有改变:/ – user1056466

0

为什么不(与CONVERT而不是CAST):

SELECT DistrictName, TownName,VarietyOfCrop, AVG(CONVERT(float, PestPopulation1)) as Pests 
FROM FinalTable2 
GROUP BY DistrictName, TownName,VarietyOfCrop 

查询中的错误是,你引用的列的表T还没有。派生表T具有ColumnName,TownName,VarietyOfCrop和Pests列,并且引用的列PestPopulation1不存在。

+0

将数据类型nvarchar转换为float时出错。它给我这个错误...我的Pest列在varchar max - – user1056466

+0

@ user1056466试试这个,用CONVERT代替CAST – eKek0

+0

仍然是同样的错误:/ – user1056466

0

您使用了错误的列名,别名,PestPopulation1是在你的子查询害虫,请找修正查询:

SELECT T.DistrictName, T.TownName, T.VarietyOfCrop, avg(T.Pests) 
FROM ( 
SELECT DistrictName, TownName,VarietyOfCrop, cast(PestPopulation1 as float) as Pests 
FROM FinalTable2 
) as T 
group by T.DistrictName, T.TownName, T.VarietyOfCrop