2 SQL запроса в одном разными условиями

Рейтинг: 0Ответов: 1Опубликовано: 28.07.2023

Есть 4 поле: contract_id, spec_summ - сумма спецификации, oplacheno - оплаченная сумма, spec_status - статус спецификации: отгружена или еще нет

contract_id spec_summ oplacheno spec_status
1 100 100 1
1 75 75 0
2 20 0 1
2 30 0 0

Нужен запрос выборки, который должен суммировать oplacheno, также суммировать spec_summ при условии где spec_status = 1 сгруппировав по contract_id

То есть такой массив:

contract_id spec_summ oplacheno spec_status
1 100 175 1
2 20 0 1

Если пробовать так:

SELECT  `contract_id`, 
                SUM(`spec_summ`) `spec_summ`, 
                SUM(`oplacheno`) `oplacheno`
        FROM `specification` WHERE `spec_status`=1 GROUP BY `contract_id`

то суммирование поле oplacheno также происходит только там где spec_status=1, а не все оплаченные суммы

Пробовал так, но все равно не выдает нужного результата

SELECT  `contract_id`, 
                SUM(`spec_summ`) `spec_summ`, 
                SUM(`oplacheno`) `oplacheno`,
        CASE
            WHEN `spec_status` = 3 THEN SUM(`spec_summ`) 
        END `FieldELSE`
        FROM `specification` GROUP BY `contract_id`

Ответы

▲ 2Принят

Вам нужно использовать условие внутри функции SUM для суммирования поля "oplacheno" только там, где "spec_status" равен 1. Вы можете сделать это с помощью функции CASE внутри функции SUM.

SELECT
`contract_id`,
SUM(`spec_summ`) AS `spec_summ`,
SUM(CASE WHEN `spec_status` = 1 THEN `oplacheno` ELSE 0 END) AS `oplacheno`
FROM
`specification`
GROUP BY
`contract_id`;

Этот запрос сначала суммирует "spec_summ" и группирует по "contract_id", а затем суммирует "oplacheno" только для тех записей, где "spec_status" равен 1.