两个 COUNT 的百分比

Percentage from two COUNTs

我有这个 查询:

SELECT DISTINCT (COUNT(?bw) AS ?total) (COUNT(?bw_bad) AS ?total_bad) WHERE
{ 
{
    SELECT ?bw WHERE 
    {
         ?bw unt:has_bwid ?id
    }
}
UNION
{
    SELECT ?bw_bad WHERE 
    {
      ?bw_bad unt:has_rbdname ?rbd_name_bad .
      ?bw_bad unt:has_concie_0 ?concie_0 .
      FILTER(?concie_0 > 40)
    }
}
}

给出:

total                                              total_bad
"2155"^^<http://www.w3.org/2001/XMLSchema#integer>  "46"^^<http://www.w3.org/2001/XMLSchema#integer> 

我想计算它们的百分比,即 (46 / 2155 * 100) 2.13%。我该怎么做?我不关心性能。


我的尝试:

SELECT ((COUNT(?bw_bad) AS ?total_bad)/(COUNT(?bw) AS ?total)*100) WHERE

给出了这个语法错误:

Encountered " "as" "AS "" at line 10, column 34. Was expecting one of: ")" ... "=" ... "!=" ... ">" ... "<" ... "<=" ... ">=" ... "||" ... "&&" ... "+" ... "-" ... "*" ... "/" ... "in" ... "not in" ... ... ... ... ... ... ...

问题是双重的:您在 计算期间 将聚合的中间结果分配给变量,然后实际上没有将最终结果分配给变量。您应该改为执行以下操作:

SELECT (COUNT(?bw_bad)/(COUNT(?bw)*100) as ?percentage)

改变这个:

SELECT ((COUNT(?bw_bad) AS ?total_bad)/(COUNT(?bw) AS ?total)*100) WHERE

对此:

SELECT (COUNT(?bw_bad)* 100 / (COUNT(?bw)) as ?total) WHERE

您 select 中的 AS 正在为聚合结果分配名称。由于您在计算中使用聚合,因此无需命名它们,这就是不允许语法的原因。

使用子select几乎总是错误的,除非它们被用来计算周围查询所需的聚合。在这种情况下您没有这样做,因此您可以删除子 selects 以获得更有效的查询:

SELECT (((COUNT(?bw_bad)/COUNT(?bw))*100) AS ?total_bad)
WHERE
{ 
  {
     ?bw unt:has_bwid ?id .
  }
  UNION
  {
    ?bw_bad unt:has_rbdname ?rbd_name_bad .
    ?bw_bad unt:has_concie_0 ?concie_0 .
    FILTER(?concie_0 > 40)
  }
}