Использование С и подмножества при построении РЕГИСТРА

#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. Да, я пойму позже. Спасибо! Это работает! И выглядит умно