【问题标题】: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') 有效,但不是全部

标签: sql sql-server sql-server-2008 tsql


【解决方案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
    

    【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多