Estou precisando encontrar um caminho para SUM()
todos os valores positivos num
e retornar o valor SUM()
de todos os números positivos e uma linha individual para cada número negativo. Abaixo está um exemplo de DDL:
Create Table #Be
(
id int
, salesid int
, num decimal(16,4)
)
Insert Into #BE Values
(1, 1, 12.32), (2, 1, -13.00), (3, 1, 14.00)
, (4, 2, 12.12), (5, 2, 14.00), (6, 2, 21.23)
, (7, 3, -12.32), (8,3, -43.23), (9, 3, -2.32)
E esta é a minha saída desejada (números positivos para cada salesid SUM()
e negativos obtêm uma linha individual retornada):
salesid num
1 26.32
1 -13.00
2 47.35
3 -12.32
3 -43.23
3 -2.32
Tente isto:
Se você quiser ambos os
sum
valores em uma linha, deverá criar uma funçãomaxValue
(eminValue
) e usá-la comosum(maxValue(0, num))
esum(minValue(0, num))
. Isso é descrito em: Existe uma função Max no SQL Server que aceita dois valores como Math.Max no .NET?Isso também funciona:
Suposições:
THEN 0
.salesid ELSE salesid+id+1
funcionaria também>= 0
( O zero é positivo ou negativo? ). Emborax+0=x
pareça tornar o=
sinal desnecessário, ajuda a lembrar que este caso não foi esquecido e como 0 é tratado (como uma SOMA ou como uma linha individual). Sethe SUM() of all positive numbers
significaSUM of strictly positive numbers
(ou seja, >0), então=
não é necessário.Deve ser testado com dados e índices reais, mas com apenas 1 table scan, o desempenho pode ser um pouco melhor em alguns casos.
A ausência de um índice parece ter um impacto menor com esta consulta nos dados de teste abaixo: