计数查询给出错误的列名错误
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'
。请注意,0
或 1
周围没有引号。如果它是 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"
【讨论】:
以上是关于计数查询给出错误的列名错误的主要内容,如果未能解决你的问题,请参考以下文章
delphi TAdoQuery组件的close方法可能导致”列名无效“错误