Процент от двух СЧЕТОВ
У меня есть этот запрос 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)
}
}