#sql #sql-server #sql-update #subquery
#sql #sql-сервер #sql-обновление #подзапрос
Вопрос:
Приветствую старших коллег. Я увлекся этим. Необходимо подставлять соответствующие значения в СЛУЧАЕ, когда построение зависит от состояния поля load_date. Проблема в том, что второму было присвоено значение полю mean_v на основе вычисления среднего mean_v, полученного для подвыборки. как реализовать получение значения и присвоение в when then? Я пытался создать псевдоним, используя alias () как () , но sql выдает синтаксическую ошибку рядом С WITH . Я должен присвоить среднее значение из подмножества, где столбцы соответствуют текущей строке для каждой строки, в чем проблема? Могу ли я использовать WITH в CASE?
UPDATE public.table
set mean_v =
CASE
WHEN table.load_date IS NOT NULL
THEN
DATEDIFF(day, CONVERT(date, table.load_date),CONVERT(date, table.req_date))
WHEN table.load_date IS NULL
THEN
--(select id, customer, code, mean_v from public.data) as t
--wish use this to set for load_date per row:
--select AVG(t.mean_v) from t, public.table
--where t.customer = table.customer
--and t.code = table.code
END```
Комментарии:
1. Чтобы ответить на ваш последний вопрос: нет, вы не можете использовать
with
внутриcase
выражения. Тем не менее, альтернативное решение, скорее всего, существует. Пожалуйста, предоставьте некоторые примерные данные и ожидаемый результат.2. Образцы данных и желаемые результаты действительно помогли бы.
Ответ №1:
Может быть, что-то вроде
UPDATE t
set mean_v =
CASE
WHEN load_date IS NOT NULL
THEN
DATEDIFF(day, CONVERT(date, load_date),CONVERT(date, req_date))
WHEN load_date IS NULL
THEN (
SELECT AVG(tt.mean_v)
FROM public.table tt
WHERE t.customer = tt.customer
and t.code = tt.code
)
END
FROM public.table t
Комментарии:
1. У меня синтаксическая ошибка около 1-го из … (SQL SERVER) при использовании UPDATE t из public.table t
2. Виноват,
FROM
нужно быть послеSET
. Исправлено в моем примере кода.3. Да, я пойму позже. Спасибо! Это работает! И выглядит умно