Sql сумма по столбцу с условием: sql — Сумма значений столбца при условии

sql — Сумма двух столбцов со своим условием для каждого за один проход MySQL


Вопрос задан


Изменён
6 лет 2 месяца назад


Просмотрен
2k раза

Есть таблица, содержащая следующие поля:
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

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации



Почта

Необходима, но никому не показывается




By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


Получение суммарных или статистических значений для всех строк в таблице — Visual Database Tools






Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Статья



Применимо к:SQL Server

Агрегатная функция

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

SELECT SUM(price)  
FROM titles  

Создайте несколько агрегатов в одном запросе, используя агрегатные функции для одного или нескольких столбцов. Например, можно создать запрос, вычисляющий общую сумму по столбцу price и среднеарифметическое значение столбца discount .

В отдельном запросе для одного и того же столбца можно определять несколько статистических операций (подведение общей суммы, подсчет, усреднение). Например, следующий запрос определяет среднеарифметическое значение и общую сумму столбца price в таблице titles :

SELECT AVG(price), SUM(price)  
FROM titles  

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

Примечание

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

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

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

Статистическая обработка значений по всем строкам

  1. Убедитесь, что таблица, в которой необходимо вычислить статистическую величину, присутствует на панели диаграмм

  2. Щелкните правой кнопкой мыши фон панели диаграммы, а затем в контекстном меню выберите пункт Группировать . Конструктор запросов и представлений добавляет столбец Группировать в сетку на панели критериев.

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

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

  4. В столбце сетки Группировать выберите нужную агрегатную функцию, например Sum, Avg, Min, Max, Count. Если необходимо вычислить статистические значения только для уникальных строк результирующего набора, выберите агрегатную функцию с параметром DISTINCT, например Min Distinct. Не выбирайте параметры Группировать, Выражениеили Где, так как они не применяются при статистической обработке всех строк.

    Конструктор запросов и представлений заменяет указанной агрегатной функцией имя столбца в инструкции, представленной на панели SQL . Например, инструкция SQL может иметь такой вид:

    SELECT SUM(price)  
    FROM titles  
    
  5. Если необходимо создать в запросе несколько статистических выражений, повторите шаги 3 и 4.

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

  6. Если необходимо, добавьте условия поиска для задания подмножества строк, для которых вычисляется сумма.

При выполнении запроса на панели результатов отображаются указанные статистические выражения.

Примечание

Конструктор запросов и представлений обслуживает агрегатные функции в инструкции, отображаемой на панели SQL до тех пор, пока режим «Группировать по» явно не будет выключен. Поэтому при изменении типа запроса или изменении состава таблиц и возвращающих табличное значение объектов, присутствующих на панелях диаграмм, конечный запрос может содержать недопустимые агрегатные функции.

См. также:

Результаты запросов сортировки и группирования (визуальные инструменты для баз данных)
Резюмирование результатов запросов (визуальные инструменты для баз данных)







Сумма SQL

с условием –

спросил

Изменено
4 года назад

Просмотрено
323 тыс. раз

В настоящее время у меня есть большой оператор SQL, в который я добавляю следующую строку, чтобы получить общую сумму денег для каждого идентификатора транзакции (которые уникальны):

 выберите сумму (наличные) из таблицы a, где a.branch = p.branch
и 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

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

mysql — SQL: ВЫБЕРИТЕ СУММУ, ГДЕ УСЛОВИЕ

Задавать вопрос

спросил

Изменено
3 года, 4 месяца назад

Просмотрено
1к раз

У меня проблемы с запросом SQL:
У меня есть таблица, подобная этой таблице данных.0027 1

Time_B : SUM того же столбца (total_time_taken) WHERE столбец (is_radiant)= 0

Time_AB : SUM 90 028 столбца (total_time_taken) ГДЕ столбец (is_radiant)= 0 ИЛИ (is_radiant)= 1

 ВЫБОР
    SUM(`matchpickban_radiant`.`total_time_taken`) КАК `draft_time_radiant`,
    SUM(`matchpickban_dire`. `total_time_taken`) КАК `draft_time_radiant`
ОТ
    (`matchpickban` КАК `matchpickban_radiant`
    ПРИСОЕДИНЯЙТЕСЬ к `matchpickban` КАК `matchpickban_dire` ON ((`matchpickban_dire`.`idmatchpickban` = `matchpickban_radiant`.`idmatchpickban`)))
ГДЕ
    `matchpickban_radiant`.`is_radiant` = 1
    И `matchpickban_dire`.`is_radiant` = 0
 

На самом деле я могу выполнить этот запрос без синтаксической ошибки, но результат NULL, потому что никакие данные не могут быть равны 0 И равны 1 в одно и то же время, очевидно…

Кроме того, я не знаю, возможно ли сделайте ПРИСОЕДИНЯЙТЕСЬ к таблице к самой себе, как это сделал я (matchpickban ПРИСОЕДИНЯЙТЕСЬ к matchpickban).

Если синтаксис правильный, мне нужно убрать WHERE CONDITION, но я не знаю, как его заменить оператором 2 IF (IF is_radiant=0 SUM(…))

Спасибо за чтение и помощь мне в этом вопросе я получил!
Если вам нужна дополнительная информация о таблице или запросе, я дам вам все, что вам нужно!

  • mysql
  • sql
  • join
  • group-by
  • where-clause

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