Статистическое выражение нельзя использовать в списке set инструкции update

.NET Aspire и cloud-native приложения C#

stackOverflow 24.05.2025

. NET Aspire — новый продукт в линейке Microsoft, который вызвал настоящий ажиотаж среди разработчиков облачных приложений. Компания называет его «опинионированным, облачно-ориентированным стеком для. . .

Python и OpenCV для распознавания и обнаружения лиц

AI_Generated 24.05.2025

Python — язык, заслуживший любовь миллионов разработчиков своей простотой и выразительностью, а OpenCV (Open Source Computer Vision Library) — библиотека компьютерного зрения с открытым исходным. . .

Брокер NATS в C#

UnmanagedCoder 24.05.2025

NATS (Neural Autonomic Transport System) — это легковесная система обмена сообщениями, которая отлично вписывается в мир современных распределённых приложений. Если вы когда-нибудь пытались построить. . .

Оптимизация производительности Express.js бэкенда

Reangularity 23.05.2025

Express. js заслуженно остаётся одним из самых популярных инструментов для создания бэкенда, но даже он не застрахован от проблем с производительностью. Многие разработчики сталкиваются с ситуацией,. . .

Продвинутая обработка данных с LINQ в C#

stackOverflow 23.05.2025

LINQ (Language Integrated Query) — это фундаментальное изменение парадигмы работы с данными в C#. Простые запросы Where и Select знакомы любому разработчику, но настоящая мощь LINQ раскрывается в. . .

Инфраструктура PKI и сертификатов безопасности

Mr. Docker 23.05.2025

PKI (Public Key Infrastructure) — это невидимый фундамент цифрового доверия, без которого современный интернет просто рассыпался бы как карточный домик. За этой аббревиатурой скрывается целый. . .

Аутентификация OAuth в Python

py-thonny 22.05.2025

OAuth (Open Authorization) — это целый стандарт для делегированного доступа. Звучит занудно? Давайте проще: OAuth позволяет приложениям получать доступ к информации пользователя на сторонних сервисах. . .

Хеширование и соль паролей в веб-приложениях C#

stackOverflow 22.05.2025

Когда-то в начале своей карьеры я тоже грешил простейшими подходами к хранению паролей – MD5-хеширование казалось верхом защиты. Но технологии не стоят на месте, вычислительные мощьности растут, и. . .

Генераторы Python для эффективной обработки данных

AI_Generated 21.05.2025

В Python существует инструмент настолько мощный и в то же время недооценённый, что я часто сравниваю его с тайным оружием в арсенале программиста. Речь идёт о генераторах — одной из самых элегантных. . .

Чем заменить Swagger в .NET WebAPI

stackOverflow 21.05.2025

Если вы создавали Web API на . NET в последние несколько лет, то наверняка сталкивались с зелёным интерфейсом Swagger UI. Этот инструмент стал практически стандартом для документирования и. . .

Как составить запрос?

UPDATE table 
если sfield равен 1 то
SET field1=CONCAT('text', field1)
если нет, то
SET field2=CONCAT('text', field2)
where id=12

задан 27 окт 2014 в 0:09

Пишу по примеру с SO, может, поправить надо будет:

UPDATE table SET
    field1 = CASE
        WHEN sfield = 1 THEN CONCAT('text', field1)
        ELSE field1
    END,
    field2 = CASE
        WHEN sfield = 1 THEN field2
        ELSE CONCAT('text', field2)
    END
;

Виталина

111 золотой знак2 серебряных знака8 бронзовых знаков

ответ дан 27 окт 2014 в 0:49

etkietki

35.8k2 золотых знака54 серебряных знака78 бронзовых знаков

Всё ещё ищете ответ? Посмотрите другие вопросы с метками sql mysql или задайте свой вопрос.

Изменение данных

Для изменения значений столбцов таблицы применяется оператор UPDATE (изменить, обновить). Чтобы изменить значения в одном столбце таблицы в тех записях, которые удовлетворяют некоторому условию, следует выполнить такой запрос.

UPDATE имяТаблицы

SET имяСтолбца = значение

WHERE условие;

За ключевым словом SET (установить) следует выражение равенства, в левой части которого указывается имя столбца, а в правой — выражение, значение которого следует сделать значением данного столбца. Эти установки будут выполнены в тех записях, которые удовлетворяют условию в операторе WHERE.

Чтобы одним оператором UPDATE установить новые значения сразу для нескольких столбцов, вслед за ключевым словом SET записываются соответствующие выражения равенства, разделенные запятыми.

UPDATE имяТаблицы

SET имяСтолбца1 = значение1, имяСтолбца2 = значение2, … , имяСтолбцаN = значениеN

WHERE условие;

Например, следующий запрос изменяет фамилию и имя клиента с кодом 5.

UPDATE Customer

SET FName=‘Иван’, LName=‘Иванов’

WHERE IdCust = 5

Использование оператора WHERE в инструкции UPDATE не обязательно. Если он отсутствует, то указанные в SET изменения будут произведены для всех записей таблицы.

Так же как и в инструкции DELETE условие в операторе WHERE инструкции UPDATE может содержать подзапросы, в том числе и связанные.

Transact-SQL расширяет стандартный SQL, позволяя использовать в инструкции UPDATE предложение FROM (по аналогии с DELETE). Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания обновляемых строк.

Если обновляемый объект тот же самый, что и объект в предложении FROM, и в предложении FROM имеется только одна ссылка на этот объект, псевдоним объекта указывать необязательно. Если обновляемый объект встречается в предложении FROM несколько раз, одна и только одна ссылка на этот объект не должна указывать псевдоним таблицы. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта.

Предположим, что требуется сделать 5% скидку по тем заказам клиентов, суммарная стоимость которых превышает 1000. Для этого следует изменить значения столбца Price, просто умножить их на 0,95. Однако эти изменения должны быть выполнены, только если суммарная стоимость заказа превышает 1000. Таким образом, в качестве критерия обновления записей в таблице OrdItem может быть задан запрос возвращающий список всех заказов с суммарной стоимостью более 1000.

UPDATE OrdItem

SET Price = Price * 0.95

FROM OrdItem o INNER JOIN

(SELECT IdOrd

FROM OrdItem

GROUP BY IdOrd

HAVING SUM(Qty*Price) > 1000) a ON o.IdOrd = a.IdOrd

Операция изменения записей, как и их удаление, связана с риском необратимых потерь данных в случае семантических ошибок при формулировке SQL-выражения. Например, стоит только забыть написать оператор WHERE, и будут обновлены значения во всех записях таблицы. Чтобы избежать подобных неприятностей, перед обновлением записей рекомендуется выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут изменены. Например, перед выполнением приведенного ранее запроса на обновление данных не помешает выполнить соответствующий запрос на выборку данных.

SELECT *

FROM OrdItem o INNER JOIN

(SELECT IdOrd

FROM OrdItem

GROUP BY IdOrd

HAVING SUM(Qty*Price) > 1000) a ON o.IdOrd = a.IdOrd

Задание для самостоятельной работы: Сформулируйте на языке SQL запрос имитирующий поступление на склад новой партий определенного товара (Обновление столбца InStock в таблице Product).

Home > SQL Server Error Messages > Msg 157 — An aggregate may not appear in the set list of an UPDATE statement.

SQL Server Error Messages — Msg 157 — An aggregate may not appear in the set list of an UPDATE statement.

SQL Server Error Messages — Msg 157

Error Message

Server: Msg 157, Level 15, State 1, Line 1
An aggregate may not appear in the set list of an 
UPDATE statement.

Causes

As the message suggests, this error occurs when you are trying to set one of your columns using the UPDATE statement with a value that uses an aggregate function such as the SUM, MAX or MIN aggregate functions.

To illustrate, let’s assume you have the following 2 tables:

CREATE TABLE [dbo].[Account Balance] (
    [Account Number]        VARCHAR(10),
    [Account Balance]       MONEY,
    [Last Transaction Date] DATETIME
)

CREATE TABLE [dbo].[Account Transaction] (
    [Account Number]        VARCHAR(10),
    [Transaction Amount]    MONEY,
    [Transaction Date]      DATETIME
)

The first table contains all the accounts in your company with the current account balance and the last transaction date. The second table contains all the transactions performed on those accounts. You are trying to update the [Account Balance] and [Last Transaction Date] columns of your [dbo].[Account Balance] table using the following UPDATE statement:

UPDATE A
SET [Account Balance] = SUM([Transaction Amount]),
    [Last Transaction Date] = MAX([Transaction Date])
FROM [dbo].[Account Balance] A INNER JOIN [dbo].[Account Transaction] B
  ON A.[Account Number] = B.[Account Number]

Issuing this UPDATE statement will generate the following error message:

Server: Msg 157, Level 15, State 1, Line 2
An aggregate may not appear in the set list of an UPDATE statement.

Solution / Work Around

To update a table with the aggregate values of another table, you have to use a sub-query as can be seen from the following UPDATE statement:

UPDATE A
SET [Account Balance] = B.[Account Balance],
    [Last Transaction Date] = B.[Last Transaction Date]
FROM [dbo].[Account Balance] A INNER JOIN 
(SELECT [Account Number], SUM([Transaction Amount]) AS [Account Balance],
        MAX([Transaction Date]) AS [Last Transaction Date]
 FROM [dbo].[Account Transaction]
 GROUP BY [Account Number]) B
ON A.[Account Number] = B.[Account Number]

Alternatively, you can also use a common-table expression (CTE) instead of a sub-query. Here’s how the query will look like using a CTE:

WITH AccountBalanceCTE AS (
    SELECT [Account Number], SUM([Transaction Amount]) AS [Account Balance],
                             MAX([Transaction Date]) AS [Last Transaction Date]
    FROM [dbo].[Account Transaction]
    GROUP BY [Account Number])
UPDATE A
SET [Account Balance]       = B.[Account Balance],
    [Last Transaction Date] = B.[Last Transaction Date]
FROM [dbo].[Account Balance] A INNER JOIN AccountBalanceCTE B
  ON A.[Account Number] = B.[Account Number]
Related Articles :
  • SQL Server Error Messages — Msg 158 — An aggregate may not appear in the OUTPUT clause.
  • SQL Server Error Messages — Msg 181 — Cannot use the OUTPUT option in a DECLARE, CREATE AGGREGATE or CREATE FUNCTION statement.
  • SQL Server Error Messages — Msg 330 — The target ‘<Object Name>’ of the OUTPUT INTO clause cannot be a view or common table expression.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Аскофен уколы инструкция по применению
  • Рисоварка cuckoo cr 0632 инструкция
  • Samsung fuzzy s832 инструкция
  • Magic kegel rejuve инструкция
  • Швейная машинка волга 1958 года инструкция по применению