양수이면 모든 항목을 합산하십시오. 음수이면 각각 반환


28

SUM()모든 양수 값에 대한 방법을 찾아 모든 양수와 각 음수에 대한 개별 행을 num반환해야합니다 SUM(). 다음은 샘플 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)

그리고 이것은 내가 원하는 결과입니다 (각 salesid SUM()및 음수의 양수는 개별 줄을 반환합니다).

salesid    num
1          26.32
1          -13.00
2          47.35
3          -12.32
3          -43.23
3          -2.32

답변:


26

이 시도:

SELECT   salesid, sum(num) as num
FROM     #BE
WHERE    num > 0
GROUP BY salesid
UNION ALL
SELECT   salesid, num
FROM     #BE
WHERE    num < 0;

당신이 모두에게하려는 경우 sum하나의 행에 값을 다음 당신은 만들어야합니다 maxValue(그리고 minValue) 함수와로 사용 sum(maxValue(0, num))하고 sum(minValue(0, num)). SQL Server에 .NET의 Math.Max와 같은 두 가지 값을 취하는 Max 함수가 있습니까?에 설명되어 있습니다.


8
쿼리를 수정했습니다. UNION ALL뿐만 아니라 필요합니다 UNION.
ypercubeᵀᴹ

24

이것도 작동합니다.

SELECT salesid, SUM(num)
FROM #BE
GROUP BY salesid, CASE WHEN num >= 0 THEN 0 ELSE id END;

가정 :

  • ID는 1에서 시작하므로 사용할 수 있습니다 THEN 0. salesid ELSE salesid+id+1잘 작동합니다
  • 0은 양수로 간주되므로 >= 0( 0은 양수 또는 음수입니까? ). 하지만 x+0=x할 것으로 보인다 =기호가 필요,이 사건이 잊혀되지 않았 음을 0이 (합으로 또는 개별 행으로)를 처리하는 방법을 기억하는 데 도움이됩니다. 경우 the SUM() of all positive numbers수단 SUM of strictly positive numbers(즉,> 0), 다음 =필요하지 않습니다.

실제 데이터 및 인덱스로 테스트해야하지만 1 개의 테이블 스캔만으로 성능이 약간 향상 될 수 있습니다.

인덱스가 없으면이 쿼리가 아래 테스트 데이터에 미치는 영향이 더 작은 것 같습니다.

SET NO COUNT ON
Create Table #Be(
  id int identity(0,1)
  ,salesid int,num decimal(16,4)
)
INSERT INTO #BE(salesid, num) 
SELECT CAST(rand()*10 as int), rand() - rand()
GO 10000 -- or 100.000

다음과 같은 iif로 그룹 절을 단순화 할 수 있습니다 : GROUP BY salesid, iif(num >= 0, 0, id) Cool query.
user2023861 2016 년

1
예. 그러나 OP는 먼저 SQL Server 2012를 설치해야합니다. IIF는 SQL Server 2012 ( msdn.microsoft.com/en-us/library/hh213574.aspx)로 시작합니다 . OP는 자신의 질문에 SQL Server 2008 태그를 달았습니다.
Julien Vavasseur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.