У меня возникли проблемы с возвратом значений в процент контрольного списка столбцов. Это дает ошибку «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=». Представленные таблицы являются просто образцом из тысяч строк, которые имеют много оценок.
Таблиц 2, и я извлек этот образец из тысяч строк:
╔═════════╦═══════════════╗
║ id ║ value_integer ║
╠═════════╬═══════════════╣
║ 2059064 ║ NULL ║
╠═════════╬═══════════════╣
║ 2064435 ║ NULL ║
╠═════════╬═══════════════╣
║ 2064889 ║ NULL ║
╠═════════╬═══════════════╣
║ 2064893 ║ NULL ║
╠═════════╬═══════════════╣
║ 2086272 ║ NULL ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL ║
╠═════════╬═══════════════╣
║ 2128447 ║ NULL ║
╠═════════╬═══════════════╣
║ 2134036 ║ NULL ║
╠═════════╬═══════════════╣
║ 2163046 ║ NULL ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL ║
╠═════════╬═══════════════╣
║ 2175279 ║ NULL ║
╠═════════╬═══════════════╣
║ 2186928 ║ NULL ║
╠═════════╬═══════════════╣
вторая таблица:
╔═════════╦════════════╗
║ id ║ evaluation ║
╠═════════╬════════════╣
║ 2059064 ║ 0 ║
╠═════════╬════════════╣
║ 2064435 ║ 0 ║
╠═════════╬════════════╣
║ 2064889 ║ 0 ║
╠═════════╬════════════╣
║ 2064893 ║ 0 ║
╠═════════╬════════════╣
║ 2086272 ║ 50001 ║
╠═════════╬════════════╣
║ 2128447 ║ 0 ║
╠═════════╬════════════╣
║ 2128447 ║ 0 ║
╠═════════╬════════════╣
║ 2128447 ║ 50001 ║
╠═════════╬════════════╣
║ 2134036 ║ 50001 ║
╠═════════╬════════════╣
║ 2163046 ║ 50001 ║
╠═════════╬════════════╣
║ 2175279 ║ 50006 ║
╠═════════╬════════════╣
║ 2175279 ║ 50001 ║
╠═════════╬════════════╣
║ 2186928 ║ 50004 ║
╠═════════╬════════════╣
║ 2190848 ║ 50001 ║
╠═════════╬════════════╣
║ 2190848 ║ 0 ║
╠═════════╬════════════╣
║ 2190848 ║ 0 ║
╠═════════╬════════════╣
║ 2190848 ║ 1 ║
╠═════════╬════════════╣
║ 2190848 ║ 1 ║
╠═════════╬════════════╣
║ 2222107 ║ 1 ║
╠═════════╬════════════╣
║ 2250093 ║ 1 ║
╠═════════╬════════════╣
║ 2250093 ║ 1 ║
╠═════════╬════════════╣
║ 2250093 ║ 50005 ║
╠═════════╬════════════╣
║ 2250093 ║ 0 ║
╠═════════╬════════════╣
╚═════════╩════════════╝
Цель состоит в том, чтобы рассчитать процент выбранной оценки / общей оценки. Оценка 50001 — да, а 0 и 1 означают, что не оценивались или не выбирались соответственно.
UPDATE DB.D_ENERGY_REFERENCE
SET D_ENERGY_REFERENCE.VALUE_INTEGER = (SELECT (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
FROM DB.D_CHECK_LIST D_CHECK_LIST
WHERE D_CHECK_LIST.EVALUATION = 50001
GROUP BY ID) / (SELECT CAST(COUNT(EVALUATION) AS FLOAT)
FROM DB.D_CHECK_LIST D_CHECK_LIST
WHERE D_CHECK_LIST.EVALUATION NOT IN (0,1)
GROUP BY ID) * 100
FROM DB.D_CHECK_LIST D_CHECK_LIST
WHERE D_CHECK_LIST.ID IN (SELECT ID
FROM DB.D_ENERGY_REFERENCE
WHERE ID = D_CHECK_LIST.ID))
Я сделал и застрял. Он дает значение в отдельном операторе select
Вы оба пробовали? Вложенный и внешний?
Если мы поместим туда табуляцию, мы увидим, что yuio даже не закрывает все скобки. Но этот подзапрос определенно вернет несколько строк, так как он возвращает строку для каждого значения ID
в таблице D_CHECK_LIST
, которая также находится в таблице D_ENERGY_REFERENCE
. Возможно, вам лучше показать свои данные и ожидаемые результаты здесь.
Наверное дело в UPDATE .. FROM .. JOIN ..
Я опустил закрывающую скобку, она есть в коде. Я положил его туда. Все тот же результат
Чем больше я смотрю на запрос, тем больше я не понимаю, какова его цель. Я даже не осознавал до сих пор, но подзапросы в подзапросе даже вернут несколько строк, так как есть GROUP BY
на ID
. Ни один из этих запросов не использует боковое соединение для ограничения возвращаемых результатов, поэтому я на самом деле понятия не имею, что делает OP на этом этапе.
Вы должны попробовать свои предложения по одному и убедиться, что каждое из них дает вам только один результат. Я думаю, что SELECT ID FROM DB.D_ENERGY_REFERENCE WHERE ID = D_CHECK_LIST.ID
дает вам более 1 строки, потому что вы используете его с «IN» вместо «=»
@Ламу. Я отправлю образец таблицы для вас, чтобы увидеть позже.
@Lamu я поставил образец таблицы
Я думаю, вы ищете сценарий обновления, как показано ниже:
Примечание: Сначала попробуйте с тестовыми данными.
UPDATE T
SET T.VALUE_INTEGER = A.Val
FROM D_ENERGY_REFERENCE T
INNER JOIN
(
SELECT
ID,
CASE
WHEN CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT) = 0 THEN 0
ELSE
(
CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION = 50001 THEN EVALUATION ELSE NULL END) AS FLOAT)
/
CAST(COUNT(CASE WHEN D_CHECK_LIST.EVALUATION NOT IN (0,1) THEN EVALUATION ELSE NULL END) AS FLOAT)
) * 100
END AS Val
FROM D_CHECK_LIST
GROUP BY ID
)A ON T.ID = A.ID
У МЕНЯ ОШИБКА Неправильный синтаксис рядом с ')'. AT LINE 9 CASE WHEN D_CHECK_LIST.EVALUATION = 50001 THEN EVALUATION ELSE NULL)
к сожалению, оператор CASE не был завершен должным образом. Пожалуйста, попробуйте сейчас.
Спасибо. Теперь ошибка «Делить на ноль».
С этим можно легко справиться.
Да, я попробую ноль, если
Спасибо. Работает как положено. Ваше здоровье
Один из ваших подзапросов возвращает более одной записи. Попробуйте запустить их отдельно, и вы найдете свою проблему.