Процент от двух СЧЕТОВ

У меня есть этот запрос sparql:

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

который дает эту синтаксическую ошибку:

Обнаружено "" как "" КАК "" в строке 10, столбец 34. Ожидалось одно из: ")"... "="... "! ="... ">"... "<"... "<="... ">="... "||"... "&&"... "+"... "-"... "*"... "/"... "в"... "не в".....................

3 ответа

Решение

Изменить это:

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

к этому:

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

Проблема двоякая: вы назначаете промежуточный результат ваших агрегатов переменным во время вычислений, а затем вы фактически не назначаете окончательный результат переменной. Вместо этого вы должны сделать что-то вроде этого:

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

AS в вашем выборе присваивается имя совокупному результату. Поскольку вы используете агрегаты в вычислениях, нет необходимости называть их, и поэтому синтаксис не допускается.

Использование вложенных элементов выбора почти всегда является ошибкой, если только они не используются для вычисления агрегата, необходимого для окружающего запроса. В этом случае вы этого не делаете, и поэтому вы можете удалить вложенные элементы для более эффективного запроса:

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)
  }
}
Другие вопросы по тегам