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

Помогите пожалуйста.
Есть данный запрос «Update Table_1 set Fx = (id/(MAX(id)+1))» , Где нужно высчитать столбец Fx, который равен id/»количество_строк_либо_максимальное_значение_id»+1) Помогите, как это сделать. Пишет данную ошибку Статистическое выражение нельзя использовать в списке SET инструкции UPDATE.

задан 13 апр 2020 в 15:40

Andrey's user avatar

Как-то так:

Update Table_1 set Fx = id/(select MAX(id)+1 from Table_1)

ответ дан 13 апр 2020 в 15:49

Sergey Moiseenko's user avatar

Sergey MoiseenkoSergey Moiseenko

1,0661 золотой знак7 серебряных знаков7 бронзовых знаков

2

Aumi

20 / 35 / 14

Регистрация: 08.10.2015

Сообщений: 406

1

Запрос на обновление

20.03.2018, 15:05. Показов 5705. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте,

Есть две таблицы

tab1(id, price,….)
tab2(id, price,….)

В tab2 mydate-пустой столбец. Требуется его обновить. Проставить максимальный price из tab1 по данному id. В tab2 id не повторяются

Пример данных в таблицах
tab1
id price
1 5
1 10
2 3
3 8
3 4

После обновления в tab2 будет
id price
1 10
2 3
3 8

мой запрос

SQL
1
2
3
  UPDATE tab2
  SET price=(SELECT MAX(p.price) FROM tab1 WHERE id=p.id)
 FROM tab2 INNER JOIN tab1 p ON id=p.id

Ошибка: Статистическое выражение нельзя использовать в списке SET инструкции UPDATE.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

20.03.2018, 15:05

Ответы с готовыми решениями:

Запрос на обновление
Всем доброго времени суток.
Есть модель:

Необходимо повысить на 20% стипендию студентам, у…

Запрос на обновление
Есть 2 таблицы. 1 содержит фамилию арбитра и рейтинг, а вторая Раунд матча. Как сделать так чтобы…

Запрос на обновление данных
Здравствуйте. Есть простая таблица:
id (int)
Country (Text)
City (Text)
Street (Text)
Name…

Запрос на Обновление таблицы
Ребята подскажите, как лучше написать запрос. Есть таблица, в ней допустим 100 записей номеров…

3

Igr_ok

784 / 615 / 273

Регистрация: 04.08.2015

Сообщений: 1,707

20.03.2018, 15:15

2

Лучший ответ Сообщение было отмечено Aumi как решение

Решение

SQL
1
2
3
UPDATE tab2
SET price=t2.price FROM tab1 t1 INNER JOIN(
SELECT MAX(price) AS price, id FROM tab2 GROUP BY id) t2 ON t1.id=t2.id



1



20 / 35 / 14

Регистрация: 08.10.2015

Сообщений: 406

20.03.2018, 15:42

 [ТС]

3

Igr_ok, говорит, что «Неправильный синтаксис около конструкции «t2″»

Добавлено через 19 минут
поменяла SET price=t2.price на SET price=Nprice. И в внутреннем запросе AS Nprice



0



3343 / 2044 / 731

Регистрация: 02.06.2013

Сообщений: 5,023

20.03.2018, 16:38

4

Цитата
Сообщение от Aumi
Посмотреть сообщение

Ошибка: Статистическое выражение нельзя использовать в списке SET инструкции UPDATE.

Потому что нужно писать не SELECT MAX(p.price) FROM tab1 WHERE id=p.id, а SELECT MAX(price) FROM tab1 WHERE id=p.id



0



I’m trying to write a query that updates tbl8_update_transactions HID field (where it’s null) with the primary key value (HID) that’s highest in HOLIDAY_DATE_TABLE. I get the following error

«An aggregate may not appear in the set list of an UPDATE statement»

I’ve read that I need to accomplish this using a subquery, but need help. Thanks

USE BillingUI;
UPDATE tbl8_update_transactions
SET tbl8_update_transactions.HID = MAX(HOLIDAY_DATE_TABLE.HID)
FROM HOLIDAY_DATE_TABLE
WHERE tbl8_update_transactions.HID = NULL;

Update: Tried the proposed solution

UPDATE tbl8_update_transactions
SET HID = h.maxHID
FROM (select max(HOLIDAY_DATE_TABLE.HID) as maxHID from HOLIDAY_DATE_TABLE) h
WHERE tbl8_update_transactions.HID IS NULL;

Unfortunately this affects 0 rows/doesn’t work. I think this is because HID is a foreign key (in tbl8_update_transactions). The real issue seems to be my C# methodology for inserting the records into the table (it inserts the row without populating the foreign key). I’d like to handle it with triggers rather than C# code. My tables are as follows.

USE BillingUI;
CREATE TABLE HOLIDAY_DATE_TABLE
(
HID INT IDENTITY PRIMARY KEY,
TABLE_NUMBER nchar(2) NOT NULL,
HOLIDAY_DATE nchar(8) NOT NULL,
FIELD_DESCRIPTION nVARchar(43) NULL,
);

USE BillingUI;
CREATE TABLE tbl8_update_transactions
(
TID INT IDENTITY PRIMARY KEY,
TABLE_NUMBER nchar(2) NOT NULL,
HOLIDAY_DATE nchar(8) NOT NULL,
FIELD_DESCRIPTION nVARchar(43) NULL,
HID int,
FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID)
);

I think this might solve the null foreign key issue if I can get help with it

CREATE TRIGGER tbl8_ins
ON HOLIDAY_DATE_TABLE
FOR INSERT
AS
BEGIN
INSERT INTO tbl8_update_transactions
SELECT * FROM HOLIDAY_DATE_TABLE
WHERE HID = MAX(HID);
END

In case you want to see my C# code that performs the insert successfully, but doesn’t populate the foreign key

 public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Table8/Create

    [HttpPost]
    public ActionResult Create(HOLIDAY_DATE_TABLE holiday_date_table, tbl8_update_transactions tbl8_update_transaction)
    {
        if (ModelState.IsValid)
        {
            db.HOLIDAY_DATE_TABLE.Add(holiday_date_table);
            db.SaveChanges();
            db.tbl8_update_transactions.Add(tbl8_update_transaction);
            db.SaveChanges();
            return RedirectToAction("../Billing/HolidayDateTable");
        }
        return View(holiday_date_table);
    }

Всем привет! Сегодня в материале я расскажу о том, как происходит обновление данных в Microsoft SQL Server с использованием языка T-SQL, будет рассмотрена инструкция UPDATE. Иными словами, Вы узнаете, как изменить уже существующие данные в таблицах на SQL Server.

Ранее я уже рассказывал о том, как создаются таблицы, как они изменяются, как происходит добавление данных в эти таблицы, поэтому пришло время рассказать о том, как происходит изменение (обновление) существующих данных.

Заметка!

Упомянутые выше материалы:

  • Создание таблиц в Microsoft SQL Server (CREATE TABLE);
  • Изменение таблиц в Microsoft SQL Server (ALTER TABLE);
  • Добавление данных в таблицы (INSERT INTO).

Заметка! Для комплексного изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL.

Скриншот 1

Содержание

  1. Как обновить данные в таблицах Microsoft SQL Server?
  2. Описание инструкции UPDATE в T-SQL
  3. Упрощенный синтаксис UPDATE
  4. Примеры использования инструкции UPDATE
  5. Исходные данные для примеров
  6. Пример обновления одного столбца всех строк таблицы
  7. Пример обновления двух столбцов и только некоторых строк таблицы
  8. Пример использования выражений в инструкции UPDATE
  9. Пример обновления данных таблицы на основе данных другой таблицы
  10. Пример обновления данных с использованием подзапроса
  11. Видео-инструкция по обновлению данных в Microsoft SQL Server

Изменить данные в таблицах Microsoft SQL Server можно с помощью:

  • Инструкции UPDATE;
  • Конструктора SQL Server Management Studio (SSMS).

Однако в реальности обновление данных происходит только с использование инструкции UPDATE, так как использовать конструктор SSMS для каких-то массовых изменений невозможно, даже процесс обновления одного значения крайне неудобен. Поэтому я не использую конструктор, мне кажется, его мало кто использует.

Поэтому сегодня мы подробно поговорим об инструкции UPDATE.

Описание инструкции UPDATE в T-SQL

UPDATE – инструкция SQL, с помощью которой происходит изменение существующих данных в таблицах.

Важные моменты:

  • Если инструкция UPDATE, т.е. обновление строк, нарушает какое-нибудь ограничение или правило, или новое значение имеет несовместимый тип данных (хотя бы для одной строки), то возникнет ошибка и все изменения отменяются, никакие строки не обновляются;
  • По умолчанию инструкция UPDATE получает монопольную блокировку на целевую таблицу, которую она изменяет, это означает, что пока одна инструкция UPDATE выполняется, т.е. изменяет данные в таблице, другие инструкции не могут изменять данные в этой таблице;
  • Чтобы использовать инструкцию UPDATE, нужны соответствующие разрешения на изменение данных, а также на чтение данных, если инструкция содержит условие WHERE;
  • Если Вам нужно узнать количество строк, которые Вы обновили инструкцией UPDATE, например, для возврата в клиентское приложение или для любых других целей, то для этого Вы можете использовать функцию @@ROWCOUNT.

Упрощенный синтаксис UPDATE

Синтаксис UPDATE достаточно большой, и начинающим понять его сложно, поэтому, для того чтобы было проще понять логику формирования инструкции UPDATE, я приведу упрощенный синтаксис.

UPDATE Целевая таблица SET Имя столбца = Значение

FROM Таблица источник

WHERE Условие

Где

  • UPDATE – инструкция обновления;
  • Целевая таблица – таблица, данные в которой необходимо изменить;
  • SET – команда, которая задает список обновляемых столбцов. Каждый следующий столбец указывается через запятую;
  • Имя столбца – столбец, в котором расположены данные, которые необходимо изменить;
  • Значение – новое значение, на которое необходимо изменить значение столбца. Можно указывать как конкретное значение, так и расчётное выражение, функцию или подзапрос. Также можно указать ключевое слово DEFAULT, что будет означать, что столбцу необходимо присвоить значение по умолчанию;
  • FROM – секция, которая указывает таблицу, из которой необходимо взять новое значение столбца. Секция может содержать объединение JOIN;
  • Таблица источник – таблица, в которой расположено новое значение столбца;
  • WHERE – условие отбора строк, подлежащих обновлению.

Сейчас давайте рассмотрим несколько примеров SQL инструкций, которые будут обновлять данные в таблице инструкцией UPDATE.

Исходные данные для примеров

Для начала давайте определимся с исходными данными, чтобы Вы понимали, какие именно данные у нас есть, и что мы будем обновлять.

Также сразу скажу, что в качестве SQL сервера у меня выступает версия Microsoft SQL Server 2017 Express.

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

Курс по SQL для начинающих

   
   --Создание таблицы Goods
   CREATE TABLE Goods (
        ProductId       INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_ProductId PRIMARY KEY,
        Category        INT NOT NULL,
        ProductName     VARCHAR(100) NOT NULL,
        ProductDescription VARCHAR(300) NULL,
        Price           MONEY NULL,
   );
   GO

   --Создание таблицы Categories
   CREATE TABLE Categories (
        CategoryId   INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_CategoryId PRIMARY KEY,
        CategoryName VARCHAR(100) NOT NULL
   );

   --Добавление строк в таблицу Categories
   INSERT INTO Categories(CategoryName)
        VALUES ('Комплектующие ПК'),
                   ('Мобильные устройства');
   GO

   --Добавление строк в таблицу Goods
   INSERT INTO Goods(Category, ProductName, ProductDescription, Price)
        VALUES (1, 'Системный блок', 'Товар 1', 300),
                   (1, 'Монитор', 'Товар 2', 200),
                   (2, 'Смартфон', 'Товар 3', 100);
   GO

   --Выборка данных
   SELECT * FROM Goods;
   SELECT * FROM Categories;

Скриншот 2

Пример обновления одного столбца всех строк таблицы

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

Для наглядности и удобства отслеживания внесенных изменений я буду во всех примерах перед и после UPDATE посылать простой запрос SELECT, чтобы видеть, какие данные были и какие стали.

   
   --Выборка данных
   SELECT * FROM Goods;

   --Обновление
   UPDATE Goods SET ProductDescription = 'Товар';

   --Выборка данных
   SELECT * FROM Goods;

Скриншот 3

Как видите, в итоге получился очень простой запрос на обновление, мы обновили значения в столбце ProductDescription у всех строк на «Товар».

Пример обновления двух столбцов и только некоторых строк таблицы

Теперь давайте обновим два столбца, и конкретизируем строки для обновления, т.е. мы обновим не все строки в таблице, как в предыдущем примере, а только те, которые подходят под указанное нами условие (для примера Category с идентификатором 1).

   
   --Выборка данных
   SELECT * FROM Goods;

   --Обновление
   UPDATE Goods SET ProductDescription = 'Товар NEW',
                                 Price = 400
   WHERE Category = 1;

   --Выборка данных
   SELECT * FROM Goods;

Скриншот 4

В этом случае изменились значения столбцов ProductDescription и Price в строках, в которых Category = 1.

Пример использования выражений в инструкции UPDATE

Как я уже отмечал, в качестве нового значения может выступать не только какое-то конкретное значение, но и целое выражение, в котором могут использоваться как другие столбцы таблицы, так и столбец, который в данный момент обновляется.

В следующем примере в столбец ProductDescription мы добавим дополнительный текст (просто цифру 3), а значение Price мы увеличим в полтора раза. Все это мы сделаем для строки с Category = 2.

   
   --Выборка данных
   SELECT * FROM Goods;

   --Обновление
   UPDATE Goods SET ProductDescription = ProductDescription + ' 3',
                                 Price = Price * 1.5
   WHERE Category = 2;

   --Выборка данных
   SELECT * FROM Goods;

Скриншот 5

Пример обновления данных таблицы на основе данных другой таблицы

Достаточно часто требуется обновить данные одной таблицы на основе данных другой, например, просто скопировать данные. Это можно сделать за счет объединения нужных таблиц в инструкции UPDATE. При этом существует несколько способов объединения, я покажу два.

Для примера здесь мы скопируем название категорий из таблицы Categories, и вставим их в столбец ProductDescription таблицы Goods, объединять будем по идентификатору категории.

   
   --Выборка данных
   SELECT * FROM Goods;

   --Обновление
   --Способ 1
   UPDATE G SET ProductDescription = C.CategoryName
   FROM Goods G
   INNER JOIN Categories C ON G.Category = C.CategoryId;        

   --Способ 2 (эквивалент)
   UPDATE Goods SET ProductDescription = C.CategoryName
   FROM Categories C
   WHERE Goods.Category = C.CategoryId; 

   --Выборка данных
   SELECT * FROM Goods;

Скриншот 6

Пример обновления данных с использованием подзапроса

В этом примере я покажу, как можно использовать подзапрос в инструкции UPDATE. Для примера мы подсчитаем количество товаров в каждой категории и присвоим полученное значение столбцу ProductDescription.

Для того чтобы узнать количество товаров, мы будем использовать встроенную функцию COUNT, а для преобразования числа в строку — функцию CAST. Фильтровать строки в подзапросе мы будем по идентификатору категории, значение для сравнения будем получать из основного запроса.

   
   --Выборка данных
   SELECT * FROM Goods;

  --Обновление
  UPDATE Goods SET ProductDescription = 'Всего товаров: ' + (SELECT CAST(COUNT(*) AS VARCHAR(10))
                                                        FROM Goods G 
                                                        WHERE G.Category = Goods.Category);

   --Выборка данных
   SELECT * FROM Goods;

Скриншот 7

Как видите, все отработало так, как мы задумали.

Видео-инструкция по обновлению данных в Microsoft SQL Server

У меня на этом все, надеюсь, материал был Вам полезен, пока!

Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.

В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:

UPDATE таблица SET поле = значение

Здесь, UPDATE – команда указывающая, что запрос на обновление данных;

таблица – название таблицы, в которой будет проводиться изменения;

SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;

поле – поле таблицы, в которое будет внесено изменение;

значение – новое значение, которое будет внесено в поле.

Например, если необходимо задать полю во всех строках таблицы значение равное нулю, можно выполнить такой запрос:

UPDATE goods SET price = 0

В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.

Изменение одного значения

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

Имеется таблица:

num
(номер товара)
title
(название)
price
(цена)
1 Чайник 300
2 Чашка 100
3 Ложка 25
4 Тарелка 100

Для примера, нужно обновить стоимость товара с известным нам его значением num. Для этого, выполним следующий запрос:

UPDATE goods SET price = 150 WHERE num = 2

Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.

Внесение изменений в несколько строк с условием отбора

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

Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:

UPDATE goods SET price = price / 2 WHERE price >= 100

Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.

price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.

В результате выполнения такого запроса получим таблицу с измененными записями:

num
(номер товара)
title
(название)
price
(цена)
1 Чайник 150
2 Чашка 50
3 Ложка 25
4 Тарелка 50

Обновление значений в нескольких полях строки

При необходимости обновлять сразу несколько полей, все поля с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:

UPDATE goods SET title = "утюг", price = 300 WHERE num = 2

Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.

Выше приведены основные виды операций обновления. На их основе формируется запросы для решения большинства задач изменения данных в разработке с применением SQL.

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 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]
Related Articles :
  • Frequently Asked Questions — SQL Server Error Messages
  • Frequently Asked Questions — INSERT Statement
  • Frequently Asked Questions — SELECT Statement

Это тоже интересно:

  • Статистика форма 11 краткая инструкция по заполнению 2022 год
  • Статистическая форма 12 вэс услуги инструкция по заполнению
  • Статистика 12 ф расчеты инструкция по заполнению
  • Статины розувастатин инструкция по применению отзывы
  • Статины препараты инструкция по применению

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

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии