2016-06-22 1 views
0

나는 다음과 같은 데이터 세트 얻을 수있는 쿼리를 작성하는 올바른 방법을 찾기 위해 노력하고있어 :SQL 서버 SUM은 동일한 출력에 3 개 가지 방법으로 계산

CustName  CityID  TransactionCount Complete InProc 
Hammertown  10001  200     50   150 
SportsAuth  10002  10     1   9 

"완료"는 작은 또 다른 컬럼 (형식) 미도시 TransactionCount의 집합, TransactionCount의 합이어야 같다 :

having [format]=23 
or [format]=25 
or [format]=38 
or [format]>=400 and [format]<=499 
or [format]>=800 and [format]<=899 

"에서 InProc"다음 TransactionCount 값의 나머지 부분이어야한다. 지금까지 나는 함께 왔어요 다음

SELECT c.CustName, 
t.[City], 
sum (t.[TransactionCount]) as InProc 
FROM [log].[dbo].[TransactionSummary] t 
JOIN [log].[dbo].[Customer] c 
on t.CustNo = c.CustNo 
and t.City = c.City 
and t.subno = c.subno 
where t.transactiondate between '6/1/16' and '6/22/16' 
group by c.CustName,t.City,t.TransactionCount,[format] 
having [format]=23 
or [format]=25 
or [format]=38 
or [format]>=400 and [format]<=499 
or [format]>=800 and [format]<=899 

을이 현재 다음과 같은 데이터 출력 : 그래서 나만 한 결과를 다시 각 고객 받고 있지 않다되지

CustName  CityID  InProc 
Hammertown  10001  147 
Hammertown  10001  1 
Hammertown  10001  1 
Hammertown  10001  1 
SportsAuth  10002  4 
SportsAuth  10002  4 
SportsAuth  10002  1 

을,하지만 난 돈 ' 이 쿼리를 깨지 않고 다른 두 열을 어떻게 추가 할 것인지 알 수 없습니다. 내가 얻을 수있는 도움이 무엇이든간에 크게 감사하겠습니다.

+1

그렇게 다른 질문을 어떤 일에-프로세스? http://stackoverflow.com/questions/37971573/sql-adding-column-a-depend-on-value-in-column-b –

+0

샘플 데이터가 없으면 결과를 이해하는 데 도움이되지 않습니다 –

답변

0
SELECT sq.*, sq.TransactionCountTotal - sq.CompleteTotal as InProcTotal from 
(
    select 
    c.CustName, 
    t.[City], 
    sum (t.TransactionCount) as TransactionCountTotal 
    sum (
     case 
      when (
       [format] in (23,25,38) 
       or [format] between 400 and 499 
       or format between 800 and 899 
       ) 
     then t.TransactionCount 
     else 0 
     end 
    ) as CompleteTotal 
    FROM [log].[dbo].[TransactionSummary] t 
    INNER JOIN [log].[dbo].[Customer] c 
     on t.CustNo = c.CustNo 
     and t.City = c.City 
     and t.subno = c.subno 
    where t.transactiondate between '6/1/16' and '6/22/16' 
    group by c.CustName,t.City 
) sq 
+0

당신은 일종의 것입니다. 마법사. 고마워요.이게 정확히 제가 이루기를 바랐던 것입니다. – jwabsolution1

+0

감사합니다. '(조건 (조건) (값) else else 0 끝)'합계는 당신이 그룹에서 무언가를 버켓팅해야하는 이러한 유형의 쿼리에 매우 유용합니다. – Eric

0

CustName과 CityID로 두 개의 하위 집합을 가져올 수 있다고 가정하면 (귀하의 예는 명확하지 않습니다). 간단한 조인을 사용하면이를 결합 할 수 있습니다. 아래 예제에서. 별칭 A는 기본 요약 될 및 별칭 B는 수와

Select A.CustName 
     ,A.CityID 
     ,A.TransactionCount 
     ,Complete = A.TransactionCount - isnull(B.InProc,0) 
     .InProc = isnull(B.InProc,0) 
From (Select CustName,CityID,TransactionCount=sum(Transactions) From SomeTable Group By CustName,CityID) A 
Left Join (Select CustName,CityID,InProc=sum(InProc) From SomeOtherTable Group By CustName,CityID) B 
Order By A.CustName,,A.CityID