+ (сложение) (Transact-SQL)
складывает два числа. С помощью этого арифметического оператора сложения можно также прибавлять число дней к дате.
Синтаксис
expression + expression
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
выражение
Любое допустимое выражение expression одного из типов данных числовой категории, кроме типа данных bit. Нельзя использовать с типами данных date, time, datetime2 или datetimeoffset.
Типы результата
Возвращает результат типа данных аргумента с более высоким приоритетом. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).
Примеры
А. Использование оператора сложения для вычисления общего числа часов отсутствия на рабочем месте для каждого сотрудника.
В этом примере приведен расчет общего времени отсутствия на рабочем месте (в часах) для каждого сотрудника путем сложения отпускных часов и часов отсутствия по болезни.
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, VacationHours, SickLeaveHours, VacationHours + SickLeaveHours AS 'Total Hours Away' FROM HumanResources.Employee AS e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ORDER BY 'Total Hours Away' ASC; GO
B. Использование оператора сложения для добавления дней к значениям даты и часа
В этом примере число дней прибавляется к дате типа datetime .
SET NOCOUNT ON DECLARE @startdate DATETIME, @adddays INT; SET @startdate = 'January 10, 1900 12:00 AM'; SET @adddays = 5; SET NOCOUNT OFF; SELECT @startdate + 1.25 AS 'Start Date', @startdate + @adddays AS 'Add Date';
Start Date Add Date --------------------------- --------------------------- 1900-01-11 06:00:00.000 1900-01-15 00:00:00.000 (1 row(s) affected)
C. Сложение данных символьного и целочисленного типов
В приведенном ниже примере складываются значения типа int и символьного типа путем преобразования данных символьного типа в тип int. Если в строке типа char есть недопустимый символ, Transact-SQL возвращает ошибку.
DECLARE @addvalue INT; SET @addvalue = 15; SELECT '125127' + @addvalue;
----------------------- 125142 (1 row(s) affected)
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
Г. Использование оператора сложения для вычисления общего числа часов отсутствия на рабочем месте для каждого сотрудника
В приведенном ниже примере приведен расчет общего времени отсутствия на рабочем месте (в часах) для каждого сотрудника путем сложения отпускных часов и часов отсутствия по болезни, причем результаты сортируются по возрастанию.
-- Uses AdventureWorks SELECT FirstName, LastName, VacationHours, SickLeaveHours, VacationHours + SickLeaveHours AS TotalHoursAway FROM DimEmployee ORDER BY TotalHoursAway ASC;
SQL — Урок 11. Итоговые функции, вычисляемые столбцы и представления
Теперь, мы хотим узнать, на какую сумму нам привез товар поставщик «Дом печати» (id=2). Составить такой запрос не так просто. Давайте поразмышляем, как его составить:
1. Сначала надо из таблицы Поставки (incoming) выбрать идентификаторы (id_incoming) тех поставок, которые осуществлялись поставщиком «Дом печати» (id=2):
SELECT id_incoming FROM incoming WHERE id_vendor=2;
2. Теперь из таблицы Журнал поставок (magazine_incoming) надо выбрать товары (id_product) и их количества (quantity), которые осуществлялись в найденных в пункте 1 поставках. То есть запрос из пункта 1 становится вложенным:
SELECT id_product, quantity FROM magazine_incoming WHERE id_incoming=(SELECT id_incoming FROM incoming WHERE id_vendor=2);
3. Теперь нам надо добавить в результирующую таблицу цены на найденные товары, которые хранятся в таблице Цены (prices). То есть нам понадобится объединение таблиц Журнал поставок (magazine_incoming) и Цены (prices) по столбцу id_product:
SELECT magazine_incoming.id_product, magazine_incoming.quantity, prices.price FROM magazine_incoming, prices WHERE magazine_incoming.id_product= prices.id_product AND id_incoming= (SELECT id_incoming FROM incoming WHERE id_vendor=2);
4. В получившейся таблице явно не хватает столбца Сумма, то есть вычисляемого столбца . Возможность создания таких столбцов предусмотрена в MySQL. Для этого надо лишь указать в запросе имя вычисляемого столбца и что он должен вычислять. В нашем примере такой столбец будет называться summa, а вычислять он будет произведение столбцов quantity и price. Название нового столбца отделяется словом AS:
SELECT magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity*prices.price AS summa FROM magazine_incoming, prices WHERE magazine_incoming.id_product= prices.id_product AND id_incoming= (SELECT id_incoming FROM incoming WHERE id_vendor=2);
5. Отлично, нам осталось лишь просуммировать столбец summa и наконец-то узнаем, на какую сумму нам привез товар поставщик «Дом печати». Синтаксис для использования функции SUM() следущий:
SELECT SUM(имя_столбца) FROM имя_таблицы;
Имя столбца нам известно — summa, а вот имени таблицы у нас нет, так как она является результатом запроса. Что же делать? Для таких случаев в MySQL существуют Представления . Представление — это запрос на выборку, которому присваивается уникальное имя и который можно сохранять в базе данных, для последующего использования.
Синтаксис создания представления следующий:
CREATE VIEW имя_представления AS запрос;
Давайте сохраним наш запрос, как представление с именем report_vendor:
CREATE VIEW report_vendor AS SELECT magazine_incoming.id_product, magazine_incoming.quantity, prices.price, magazine_incoming.quantity*prices.price AS summa FROM magazine_incoming, prices WHERE magazine_incoming.id_product= prices.id_product AND id_incoming= (SELECT id_incoming FROM incoming WHERE id_vendor=2);
6. Вот теперь можно использовать итоговую функцию SUM() :
SELECT SUM(summa) FROM report_vendor;
Вот мы и достигли результата, правда для этого нам пришлось использовать вложенные запросы, объединения, вычисляемые столбцы и представления. Да, иногда для получения результата приходится подумать, без этого никуда. Зато мы коснулись двух очень важных тем — вычисляемые столбцы и представления. Давайте поговорим о них поподробнее.
Вычисляемые поля (столбцы)
На примере мы рассмотрели сегодня математическое вычисляемое поле. Здесь хотелось бы добавить, что использовать можно не только операцию умножения (*), но и вычитание (-), и сложение (+), и деление (/). Синтаксис следующий:
SELECT имя_столбца_1, имя_столбца_2, имя_столбца_1*имя_столбца_2 AS имя_вычисляемого_столбца FROM имя_таблицы;
Второй нюанс — ключевое слово AS, мы его использовали для задания имени вычисляемого столбца. На самом деле с помощью этого ключевого слова задаются псевдонимы для любых столбцов. Зачем это нужно? Для сокращения и читаемости кода. Например, наше представление могло бы выглядеть так:
CREATE VIEW report_vendor AS SELECT A.id_product, A.quantity, B.price, A.quantity*B.price AS summa FROM magazine_incoming AS A, prices AS B WHERE A.id_product= B.id_product AND id_incoming= (SELECT id_incoming FROM incoming WHERE id_vendor=2);
Согласитесь, что так гораздо короче и понятнее.
Представления
Синтаксис создания представлений мы уже рассматривали. После создания представлений, их можно использовать так же, как таблицы. То есть выполнять запросы к ним, фильтровать и сортировать данные, объединять одни представления с другими. С одной стороны это очень удобный способ хранения частоприменяемых сложных запросов (как в нашем примере).
Но следует помнить, что представления — это не таблицы, то есть они не хранят данные, а лишь извлекают их из других таблиц. Отсюда, во-первых, при изменении данных в таблицах, результаты представления так же будут меняться. А во-вторых, при запросе к представлению происходит поиск необходимых данных, то есть производительность СУБД снижается. Поэтому злоупотреблять ими не стоит.
Научись программировать на Python прямо сейчас!
- Научись программировать на Python прямо сейчас
- Бесплатный курс
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.
Как в sql складывать данные из разных столбцов
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.4.2009
Репутация: нет
Всего: нет
Помогите пожалуйста никак не могу разобраться как составить запрос
есть две таблицы заполненые t0 и t1 и пустая t2
Нужно сложить значения столбца первой таблицы с значениями столбца второй, одним запросом SELECT, и записать в третью таблицу.
что б получилось:
пробовал
SELECT t0.id + t1.id FROM t0, t1;
но так mysql складывает каждое значение из первой таблицы со всем столбцом второй, получается совсем не то что надо!
Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск
Репутация: 41
Всего: 260
| Код |
| UPDATE t0 INNER JOIN t1 ON t0.id = t1.id INNER JOIN t2 ON t2.id = t0.id SET t2.value = t0.value + t1.value |
однако, преполагается, что у тебя в каждой таблице имеется primary key(в случае с моим запросом, я предполагаю, что поле id — это и есть primary key, по значению которого связываются таблицы).
если primary key у тебя нет, то задача лишена смысла: потому что даже человек не сможет сказать, какое значение с каким сравнивать: почему, к примеру, складывать «5+3», а не «5+8»?
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.4.2009
Репутация: нет
Всего: нет
Спасибо, skyboy
нет, мне не нужно ни с чем сравнивать и сортировать. просто построчно сложить значения столбцов таблиц.
складывать нужно «5+3», а не «5+8» по таму что эти числа «5+3», в одной строке таблиц t0 и t1 а «5+8» в разных.
может не понятно объяснил. попробую попроще написать
в каждой таблице есть только один столбец id INT (просто целые числа)
нужно взять число из первой строки столбца t0.id сложить с числом из первой строки столбца t0.id и записать так же в первую
строку t2.id; тоже самое для вторых строк дальше для третей и так то конца таблиц.
все таблицы имеют одинаковое колво строк.
т.е. нужно сделать примерно следующее:
t0.id t1.id t2.id
— —- ——
5 + 3 -> 8
2 + 6 -> 8
8 + 2 -> 10
3 + 8 -> 11
7 + 2 -> 9
Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск
Репутация: 41
Всего: 260
в БД нет такого механизма как номер строки.
строго говоря, при запорсе без указания поля для сортировки, СУБД имеет полное «право» каждый раз выдавать данные в другом порядке.
и связать таблицы по несуществующему номеру строки не получится никак.
создай допполе типа int auto_increment. в каждой таблице.
вот и будет тебе «номер строки». а потом воспользуешься запросом, что я тебе дал.
Добавлено через 5 минут и 29 секунд
если в третьей таблице пусто, то запрос будет не update, а insert.
| Код |
| insert into t2(value) select t0.value + t1.value from t0 inner join t1 on t1.id = t0.id |
кроме того, можно учесть, что в одной таблице записей будет не столько же, сколько во второй. заменив inner на left.
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.4.2009
Репутация: нет
Всего: нет
Спасибо за разъяснения, skyboy!
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.11.2012
Репутация: нет
Всего: нет
Вопрос аналогичен, только с некотороыми уточнениями
Есть в базе Members две таблице Users1 и Users2 обе имеют первичный ключ ID и поле Th
Требуются прибавить, значение поля Th из таблицы Users1 к соответствующим значениям поля Th в таблице Users2 и записать это в поле Th таблицы Users2
Это сообщение отредактировал(а) GreyTomcat — 5.11.2012, 11:33
[ Время генерации скрипта: 0.2185 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Как сложить числа в двух таблицах?
Надо получить результат сложения [ostatok] первой таблицы и [prihod] второй таблицы и от этого отнять [rashod] второй таблицы. Как то так: SUM(ostatok)+SUM(prihod)-SUM(rashod) . Как это сделать?
Отслеживать
9,366 4 4 золотых знака 40 40 серебряных знаков 56 56 бронзовых знаков
задан 7 дек 2011 в 11:29
141 2 2 золотых знака 13 13 серебряных знаков 31 31 бронзовый знак
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Соединять таблицы, похоже, нужно по предприятию и, возможно, еще по пункту, если знать, что это такое, но вряд ли по id. 🙂 А можно вообще ничего не соединять:
select SUM(prihod) - SUM(rashod) + (select sum(ostatok) from ostatky) from main
Отслеживать
ответ дан 7 дек 2011 в 14:58
11.5k 16 16 серебряных знаков 16 16 бронзовых знаков
Только мне непонятно что там с квадратными скобками (в каких случаях писать, а в каких нет), но смысл такой:
select ID, SUM(o.ostatok)+SUM(m.prihod)-SUM(m.rashod) from [ostatky] o left join [main] m on (m.[id] = o.[id])
Отслеживать
ответ дан 7 дек 2011 в 11:36
chernomyrdin chernomyrdin
4,188 15 15 серебряных знаков 16 16 бронзовых знаков
квадратные скобки — это аналог двойных кавычек в некоторых диалектах SQL (например, в T-SQL)
9 июн 2016 в 9:31
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
