计数查询给出错误的列名错误

Posted

技术标签:

【中文标题】计数查询给出错误的列名错误【英文标题】:Count query giving wrong column name error 【发布时间】:2015-04-01 08:11:49 【问题描述】:
select  COUNT(analysed) from Results where analysed="True" 

我想显示分析值为真的行数。

但是,我的查询给出了错误:“无法绑定多部分标识符“Results.runId”。”。

这是实际的查询:

select ((SELECT COUNT(*) AS 'Count' 
  FROM Results 
  WHERE Analysed = 'True')/failCount) as PercentAnalysed 
from Runs 
where Runs.runId=Analysed.runId

我的表架构是:

我想要的特定 runId 的值是:(analyticaled=true 的条目数)/failCount

编辑:如何合并这两个查询?

i) 选择 runId,Runs.prodId,prodDate,prodName,buildNumber,totalCount 作为 TotalTestCases,(passCount*100)/(passCount+failCount) 作为 PassPercent, passCount,failCount,runOwner from Runs,Product where Runs.prodId=Product.prodId

ii) 选择 (cast(counts.Count as decimal(10,4)) / cast(failCount as decimal(10,4))) 作为 PercentAnalysed 从运行 内部联接 ( 选择计数(*)作为“计数”,运行 ID 从结果 WHERE 分析 = '真' 按运行 ID 分组 ) 计数 on counts.runId = Runs.runId

我试过这个: 选择 runId,Runs.prodId,prodDate,prodName,buildNumber,totalCount 作为 TotalTestCases,(passCount*100)/(passCount+failCount) 作为 PassPercent, passCount,failCount,runOwner,counts.runId,(cast(counts.Count as decimal(10,4)) / cast(failCount as decimal(10,4))) as PercentAnalysed 从运行,产品 内部联接 ( 选择计数(*)作为“计数”,运行 ID 从结果 WHERE 分析 = '真' 按运行 ID 分组 ) 计数 on counts.runId = Runs.runId 其中 Runs.prodId=Product.prodId

但它给出了错误。

【问题讨论】:

从结果中选择 COUNT(analyzed) where analysed=True 不要给出“True” analysed 列是什么数据类型?如果它是 BIT 字段,那么 select COUNT(analysed) from Results where analysed=1 应该可以工作,因为在设置 BIT 字段时,使用 0 表示 'False'1 表示 'True'。请注意,01 周围没有引号。如果它是 varchar,那么单引号将起作用 select COUNT(*) as [Count] from Results where analysed = 'True' 单引号应该可以正常工作。 @chridam - select CAST('True' AS BIT), CAST('False' AS BIT) 都可以正常工作。 内部查询 (SELECT COUNT(*) AS 'Count' FROM Results WHERE Analyzed = 'True') 有效,但不是全部 【参考方案1】:

您的问题是由于表格连接不当引起的。您需要来自运行和结果的信息,但它们在您的查询中没有正确组合。您对嵌套子查询有正确的想法,但它在错误的位置。您还在外部 where 子句中引用了已分析的表,但它尚未包含在 from 子句中。

试试这个:

select (cast(counts.Count as decimal(10,4)) / cast(failCount as decimal(10,4))) as PercentAnalysed 
from Runs 
inner join
(
  SELECT COUNT(*) AS 'Count', runId 
  FROM Results 
  WHERE Analysed = 'True'
  GROUP BY runId
) counts
on counts.runId = Runs.runId

我已将其设置为内部连接,以消除任何没有分析结果的运行;如果需要这些行,可以将其更改为左连接,但需要添加代码来处理 null 情况。我还为这两个数字添加了强制转换,否则查询将执行整数除法并截断任何小数。

【讨论】:

Msg 207, Level 16, State 1, Line 12 列名“resultId”无效。 我认为这是因为您查询中的 resultId 不明确。没有说是哪个表。我尝试了 Results.resultId 但仍然不起作用 列名没有歧义,只是错误:当它应该是 runId 时,我输入了 resultId。您的运行表没有 resultId 作为列。我已经修复了我的代码。 select runId,Runs.prodId,prodDate,prodName,buildNumber,totalCount as TotalTestCases,(passCount*100)/(passCount+failCount) as PassPercent, passCount,failCount,runOwner from Runs,Product where Runs .prodId=Product.prodId 这是我的一个查询。而您的另一个是添加“PercentAnalysed”列。如何将这两个查询合并成一个查询?【参考方案2】:

我会尝试以下查询:

SELECT COUNT(*) AS 'Count'
FROM Results
WHERE Analysed = 'True'

这将计算已分析为 'True' 的所有行。如果您的 Analysed 列的数据类型是 BIT (Boolean) 或 STRING(VARCHAR, NVARCHAR),这应该可以工作。

【讨论】:

【参考方案3】:

Count 中使用CASE

SELECT COUNT(CASE WHEN analysed='True' THEN analysed END) [COUNT]
FROM Results
Click here查看结果

【讨论】:

如果他已经根据analysed='True' 条件过滤了行,他就不必遍历整个结果集。【参考方案4】:
select  COUNT(*) from Results where analysed="True"

【讨论】:

以上是关于计数查询给出错误的列名错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计数查询

delphi TAdoQuery组件的close方法可能导致”列名无效“错误

访问:使用子查询中的计数更新查询 - 错误或所有结果

编译语句时出错:FAILED:SemanticException [错误 10036]:列名重复:p_id

计算在存储过程中给出错误结果

列名中带有大写字母的 Postgres 查询