Если какой-либо пункт при группировке - PullRequest
0 голосов
/ 30 марта 2012

Выполнение Sum () для столбца суммирует значения в этом столбце на основе группировки по.Но допустим, что я хочу суммировать эти значения только в том случае, если все значения не равны нулю или не равны 0, тогда мне нужно предложение, которое проверяет, равно ли какое-либо из значений 0, прежде чем оно получит сумму.Как я могу реализовать такое предложение?

Я использую SQL Server 2005.

Спасибо,

Барри

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Давайте предложим схему вашей таблицы:

myTable( id, colA, value)

Тогда один из подходов будет следующим:

Select colA, sum(value)
from myTable
group by colA
having count( id ) = count( nullif( value, 0 ))

Обратите внимание, что nullif - это функция сервера MSSQL.ВАМ следует адаптировать код к вашей марке rdbms.

Объяснение:

count агрегатная функция только считает не нулевые значения. Здесь тест подсчета нулевых значений.

1 голос
/ 30 марта 2012

Вы говорите, что 0 + 2 + 3 = 0 для этого случая.Предполагая, что NULL + 2 + 3 также должно быть равно нулю:

SELECT GroupField,
    SUM(Value) * MIN(CASE WHEN COALESCE(Value, 0) = 0 THEN 0 ELSE 1 END)
FROM SumNonZero
GROUP BY GroupField

Приведенное выше выражение дает этот результат

GroupField   (No column name)
case1        5
case2        0
case3        0

с этими данными теста

CREATE TABLE SumNonZero (
    GroupField CHAR(5) NOT NULL,
    Value INT
)

INSERT INTO SumNonZero(GroupField, Value)
SELECT 'case1', 2
UNION ALL SELECT 'case1', 3
UNION ALL SELECT 'case2', 0
UNION ALL SELECT 'case2', 2
UNION ALL SELECT 'case2', 3
UNION ALL SELECT 'case3', NULL
UNION ALL SELECT 'case3', 3
UNION ALL SELECT 'case3', 4
0 голосов
/ 30 марта 2012

Нет смысла исключать 0 из суммы, потому что это не повлияет на сумму.Но вы можете захотеть суммировать на основе другого поля:

select FIELD, sum(
                  case when(OTHER_FIELD>0) then FIELD 
                       else 0 
                  end) 
from TABLE
group by TABLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...