Sql сумма по столбцу с условием: sql — Сумма значений столбца при условии
Содержание
sql — Сумма двух столбцов со своим условием для каждого за один проход MySQL
Есть таблица, содержащая следующие поля:
ID, FirstUserID, SecondUserID, FirstUserCount, SecondUserCount
.
При этом гарантируется, что FirstUserID <= SecondUserID
.
Нужно: за один проход посчитать сумму Count для пользователя, ID которого мы знаем.
Соответственно, нужно выбирать сначала FirstUserCount
при условии FirstUserID <= UserID
, а затем — SecondUserCount
с условием FirstUserID > UserID
, где UserID — переданный параметр. Суммировать можно в две различные переменные.
Могу ли я сделать это с помощью одного запроса MySQL?
Если нет, то как оптимально можно это сделать?
UPD: уникальность записи, а также то, что FirstUserID != SecondUserID — гарантируется.
- mysql
- sql
Нужно: за один проход посчитать сумму Count для пользователя, ID которого мы знаем.
SELECT SUM(CASE WHEN FirstUserID = @ID THEN FirstUserCount WHEN SecondUserID = @ID THEN SecondUserCount END) totalSum FROM `table`;
Запрос даст неверный результат, если существует запись, где FirstUserID = SecondUserID = @ID. Но это ведь несложно исправить…
PS. Но куда как разумнее нормализовать структуру.
4
Так не пойдёт?
SELECT (SELECT SUM(a.FirstUserCount) FROM tbl a WHERE a.FirstUserId = :userId) + (SELECT SUM(b.SecondUserCount) FROM tbl b WHERE b.SecondUserId = :userId) as total;
Либо:
SELECT SUM( IF(FirstUserID = :userId, FirstUserCount, 0) + IF(SecondUserID = :userId, SecondUserCount, 0) ) as total FROM tbl;
Можно добавить WHERE FirstUserID = :userId OR SecondUserId = :userId
для возможности дальнейшей оптимизации с помощью индексов.
2
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Получение суммарных или статистических значений для всех строк в таблице — Visual Database Tools
Twitter
LinkedIn
Facebook
Адрес электронной почты
-
Статья -
- Чтение занимает 2 мин
-
Область применения: SQL Server (все поддерживаемые версии)
Агрегатная функция
Агрегатные функции позволяют вычислять сумму всех значений, содержащихся в таблице. Например, можно создать запрос наподобие того, что приведен ниже, для отображения общей стоимости всех книг, содержащихся в таблице titles
:
SELECT SUM(price) FROM titles
Создайте несколько агрегатов в одном запросе, используя агрегатные функции для одного или нескольких столбцов. Например, можно создать запрос, вычисляющий общую сумму по столбцу price
и среднеарифметическое значение столбца discount
.
В отдельном запросе для одного и того же столбца можно определять несколько статистических операций (подведение общей суммы, подсчет, усреднение). Например, следующий запрос определяет среднеарифметическое значение и общую сумму столбца price
в таблице titles
:
SELECT AVG(price), SUM(price) FROM titles
Если добавить условия поиска, можно вычислять статистические значения на основе подмножества строк, удовлетворяющих заданному условию.
Примечание
Можно также подсчитать, сколько всего в таблице содержится строк, или строк, удовлетворяющих определенному условию. Дополнительные сведения см. в разделе Подсчет строк в таблице (визуальные инструменты для баз данных).
Если в запросе указано статистическое выражение, то для всех строк в таблице отображается только само это статистическое значение. Например, при подсчете итогового значения столбца price
в таблице titles
названия, имена издателей и другие столбцы не отображаются.
! При создании подытогов (например, групп) можно выводить значения столбцов для каждой группы. Дополнительные сведения см. в разделе Группирование строк в результатах запроса (визуальные инструменты для баз данных).
Статистическая обработка значений по всем строкам
Убедитесь, что таблица, в которой необходимо вычислить статистическую величину, присутствует на панели диаграмм
Щелкните правой кнопкой мыши фон панели диаграммы, а затем в контекстном меню выберите пункт Группировать . Конструктор запросов и представлений добавляет столбец Группировать в сетку на панели критериев.
Добавьте на панель критериев столбец, по которому необходимо вычислить статистическую величину. Убедитесь, что столбец помечен для вывода.
Конструктор запросов и представлений автоматически назначает суммируемому столбцу псевдоним, который можно заменить более понятным. Дополнительные сведения см. в разделе Создание псевдонимов столбцов (визуальные инструменты для баз данных).
В столбце сетки Группировать выберите нужную агрегатную функцию, например Sum, Avg, Min, Max, Count. Если необходимо вычислить статистические значения только для уникальных строк результирующего набора, выберите агрегатную функцию с параметром DISTINCT, например Min Distinct. Не выбирайте параметры Группировать, Выражениеили Где, так как они не применяются при статистической обработке всех строк.
Конструктор запросов и представлений заменяет указанной агрегатной функцией имя столбца в инструкции, представленной на панели SQL . Например, инструкция SQL может иметь такой вид:
SELECT SUM(price) FROM titles
Если необходимо создать в запросе несколько статистических выражений, повторите шаги 3 и 4.
Если в список выводов запроса или в список сортировки добавляется другой столбец, конструктор запросов и представлений автоматически заполняет термин Группировать в столбце сетки Группировать . Выберите соответствующую агрегатную функцию.
Если необходимо, добавьте условия поиска для задания подмножества строк, для которых вычисляется сумма.
При выполнении запроса на панели результатов отображаются указанные статистические выражения.
Примечание
Конструктор запросов и представлений обслуживает агрегатные функции в инструкции, отображаемой на панели SQL до тех пор, пока режим «Группировать по» явно не будет выключен. Поэтому при изменении типа запроса или изменении состава таблиц и возвращающих табличное значение объектов, присутствующих на панелях диаграмм, конечный запрос может содержать недопустимые агрегатные функции.
См. также:
Результаты запросов сортировки и группирования (визуальные инструменты для баз данных)
Резюмирование результатов запросов (визуальные инструменты для баз данных)
Сумма SQL
с условием a где a.ветвь = p.ветвь
и a.transID = p.transID) TotalCash
, и теперь мне нужно сделать то же самое, но только суммировать денежные значения, которые имеют дату валютирования в течение последнего месяца, поэтому у меня есть что-то вроде этого:
выберите сумму (CASE ValueDate WHEN > @startMonthDate THEN cash ELSE NULL END) из таблицы a, где a.branch = p.branch и a.transID = p.transID) TotalMonthCash
Извините, что у меня нет всего утверждения, но оно действительно длинное и специфичное для контекста хранимой процедуры, но я надеялся, что кто-нибудь поймет, что я имею в виду?
1
Вместо этого попробуйте:
СУММА (СЛУЧАЙ, КОГДА ValueDate > @startMonthDate THEN cash ELSE 0 END)
Объяснение
Синтаксис вашего выражения CASE неверен. Кажется, вы путаете простой синтаксис выражения CASE с синтаксисом искомого выражения CASE. См. документацию для CASE:
Выражение CASE имеет два формата:
- Простое выражение CASE сравнивает выражение с набором простых выражений для определения результата.
- Искомое выражение CASE оценивает набор логических выражений для определения результата.
Вам нужен искомый синтаксис выражения CASE:
CASE КОГДА Boolean_expression THEN result_expression [ ...n ] [ ИНАЧЕ else_result_expression ] КОНЕЦ
В качестве примечания: если производительность является проблемой, вы можете обнаружить, что это выражение работает быстрее, если вы перепишете его с помощью JOIN и GROUP BY вместо использования зависимого подзапроса.
0
Попробуйте переместить ValueDate
:
выберите сумму (СЛУЧАЙ КОГДА ValueDate > @startMonthDate, ТО наличные ИНАЧЕ 0 КОНЕЦ) из таблицы а где a. ветвь = p.ветвь и a.transID = p.transID
(переформатировано для ясности)
Вы также можете рассмотреть возможность использования ‘0’ вместо NULL, так как вы выполняете суммирование. Это работает правильно в обоих направлениях, но, возможно, более показательно для ваших намерений.
С условием HAVING вы удалите данные с помощью наличных денег, а не ultrapass 0, если хотите, повышая эффективность
в вашем запросе.
ВЫБЕРИТЕ СУММУ (наличными) КАК деньги ИЗ Таблицы t1, Таблицы 2 t2, ГДЕ t1.branch = t2.branch И t1.transID = t2.transID И ValueDate > @startMonthDate ИМЕЕТ деньги > 0;
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
sql — Условная сумма в группе по запросу MSSQL
спросил
Изменено
9лет, 8 месяцев назад
Просмотрено
95 тысяч раз
У меня есть таблица OrderDetails со следующей схемой:
------------------------------------ ---------------------------- | идентификатор заказа | Стоимость копирования | Полная цена | Цена | Тип цены | -------------------------------------------------- -------------- | 16 | 50 | 100 | 50 | Стоимость копирования | -------------------------------------------------- -------------- | 16 | 50 | 100 | 100 | Полная цена | -------------------------------------------------- -------------- | 16 | 50 | 100 | 50 | Стоимость копирования | -------------------------------------------------- -------------- | 16 | 50 | 100 | 50 | Стоимость копирования | -------------------------------------------------- --------------
Мне нужен запрос, который преобразует приведенную выше таблицу в новую таблицу со следующей схемой:
--------------------------- ------------------------------------- | идентификатор заказа | Количество предметов | Общая стоимость копирования | ОбщаяПолнаяЦена | -------------------------------------------------- -------------- | 16 | 4 | 150 | 100 | -------------------------------------------------- --------------
В настоящее время я использую Group By для Order. Id для подсчета элементов. Но я не знаю, как условно предположить значения CopyCost и FullPrice.
Будем признательны за любую помощь.
С уважением
Фредди
1
Попробуйте
ВЫБЕРИТЕ OrderId, СЧЁТ(*) ItemCount, СУММА (СЛУЧАЙ, КОГДА PriceType = 'CopyCost' THEN Price ELSE 0 END) TotalCopyCost, SUM(CASE WHEN PriceType = 'FullPrice' THEN Price ELSE 0 END) TotalFullPrice ОТ Детали заказа СГРУППИРОВАТЬ ПО OrderId
SQLFiddle
2
Попробуйте этот запрос
выберите номер заказа, подсчитывать (*) как cnt, sum(if(pricetype='CopyCost', CopyCost, 0)) как totalCopyCost, sum(if(pricetype='FullPrice', FullPrice, 0)) как totalFullPrice из стол группа по номер заказа
| ЗАКАЗ | УНТ | ОБЩАЯ СТОИМОСТЬ | ПОЛНАЯ ЦЕНА | -------------------------------------------------- | 16 | 4 | 150 | 100 |
1
Не могли бы вы использовать:
ВЫБОР Номер заказа, Подсчет(1) как ItemCount, СУММА (СЛУЧАЙ, КОГДА PriceType = 'CopyCost' THEN CopyCost ELSE 0 END) AS TotalCopyCost, СУММА (СЛУЧАЙ, КОГДА PriceType = 'Полная цена' THEN FullPrice ELSE 0 END) AS TotalFullPrice ОТ Детали заказа СГРУППИРОВАТЬ ПО OrderId
Вы также можете попробовать.