2012-04-19 2 views
0

DimAccounts, DimTime 및 FactBudget 테이블이 3 개 있습니다.계정 합계 방법

DimAccounts 예 :

AccountKey Accouncode AccountType AccountFrom AccountTo 
1.10001  10001  S     11401 27601 
1.10002  10002  S     11401 16501 
1.11000  11000  S     11401 11508 
1.110001 110001  B     NULL NULL 
1.110002 110002  B     NULL NULL 
1.11400  11400  S     11401 11408 

DimTime 예 :

TimeKey  FullDate 
    20020102 2002-01-02 
    20020103 2002-01-03 
    20020104 2002-01-04 

FactBudget 예 : FactBudget에서

TimeKey  AccountKey    Debit Credit 
20080523 1.110002    0.00 884.00 
20080523 1.110001    0.00 4251.96 
20100523 1.100002    229.40 0.00 
20080523 1.100002    711.79 0.00 
20090523 1.110002    0.00 711.79 
20080523 1.110001    0.00 229.40 
20040523 1.100002    0.00 15619.05 

내가 직불를 계산해야하는 단지 형 B. 많은 계정이 있고 계정 유형이 S (합계) 인 신용 합계. AccountFrom 및 AccountTo 열은 합계를 시작할 위치 (AccountFrom)와 종료 위치 (AccountTo)에서 B 유형 계정을 표시합니다.

커서를 사용하여 솔루션을 만들었지 만, 매우 나쁜 것을 알고 있습니다. FactBudget에 데이터를 그룹화하는 것이 좋습니다 (사실 factbudget 및 행 600k에 많은 열이 있기 때문에) 솔루션 검색시 나는 그룹은 60K 행을) 떠날 때 :

SELECT [TimeKey], 
     [AccountKey], 
     SUM([Debit]), 
     SUM([Credit]) 
FROM [Interlux].[dbo].[FactBudget] 
GROUP BY [TimeKey], 
      [AccountKey] 

그래서, 어떻게 TimeKey 및 AccountKey에 의해 S 계정 차변과에 Cred 합계를 얻는 방법?를

해결 방법 예 (AccountKey 데이터 타입은 NVARCHAR이다) : 사실 예산에서

TimeKey  AccountKey Debit Credit 
20080523 1.10002  0.00 2500 
20080523 1.11000  0.00 8000 
20080524 1.10002  900 0.00 

타입 S와 아무 계정도 없다 !!!! 우리는 (단지 날짜 20080523에 대한 예 1.11000)에 그것을 얻을해야합니다

select 
SUM(Debit), SUM(Credit) 
from FactBudget 
LEFT JOIN [DimAccounts] 
ON [DimAccounts].[AccountKey] = FactBudget.[AccountKey] 
where CAST([DimAccounts].AccountCode AS INT) >=11401  
and CAST([DimAccounts].AccountCode AS INT) <= 11508 
and FactBudget.Timekey = 20080523 

하지만 각 날짜별로 계정 직불 및 신용 합을 S가 필요합니다.

+0

'AccountFrom'과'AccountTo' 란 어떤 열이 관련된가요? – RedFilter

+0

또한 왜 'DimTime'테이블을 설명하는지, 여기서는 필요하지 않은 것 같습니다. – RedFilter

+1

은 위의 두 테이블에 대해 위에서 제공 한 AccountKeys입니까? 예상 결과에 1.10002가 표시되지만 해당 계정은 FactBudget 데이터에 표시되지 않습니까? – Taryn

답변

0

내가 볼 수있는 한 DimAccounts에 가입하여 B 유형 계정을 해당 S 유형 계정과 연결 한 다음 해당 행을 FactBudget에 가입시켜 최종적으로 수치를 얻습니다. 다음과 같은 것 :

SELECT 
    f.TimeKey, 
    s.AccountKey, 
    SUM(f.Debit) AS Debit, 
    SUM(f.Credit) AS Credit 
FROM DimAccounts s 
    INNER JOIN DimAccounts b ON b.AccountCode BETWEEN s.AccountFrom AND s.AccountTo 
    INNER JOIN FactBudget f ON f.AccountKey = b.AccountKey 
WHERE s.AccountType = 'S' 
    AND b.AccountType = 'B' 
GROUP BY 
    f.TimeKey, 
    s.AccountKey 
+0

그것은 작동합니다! 아직 방법은 없지만 작동 중입니다 :) 단지 3 초, 프로 시저와 커서를 사용하는 경우 2 시간 :) – Justin

+0

INNER JOIN DimAccounts b ON b.AccountCode 란 무엇입니까? 왜 "b.AccountCode = s.aacouncode"가 없는지. 어떻게 지금은 SQL에 가입하는 방법? – Justin

+0

@ Justin : 다른 방식으로 살펴보기로하자. 'FactBudget'부터 시작하자. 'FactBudget'에있는 데이터를 계정과 날짜별로 그룹화해야합니다, 맞습니까? 그러나 캐치는 S 유형 계정별로 그룹화해야하며 표는 B 유형 계정 만 참조해야합니다. 이제 S-type 계정은 B-types에 대한 일종의 부모 계정입니다. 맞습니까? 따라서 모든 B 형 계정에 대해 부모 계정 인 S 형 계정을 얻어야합니다.그리고 두 타입 모두를 포함하고있는'DimAccounts'는 두 타입이 서로 어떻게 관련되어 있는지, 즉 모든 B 타입 계정의 * code *가 S 타입의'AccountFrom'과'AccountTo' 사이에있는지를 보여줍니다. –

0
SELECT a.TimeKey, a.AccountKey, SUM(a.Debit) AS 'DebitSum', SUM(a.Credit) AS 'CreditSum' 
FROM FactBudget a 
JOIN DimAccounts b on b.AccountKey = a.AccountKey 
WHERE b.AccountType='S' 
GROUP BY a.AccountKey, a.TimeKey 

이게 당신이 원하는 것입니까?

+0

그는 AccountType을 기반으로 신용 및 직불 카드의 간단한 금액을 원한다고 생각합니다. @ stringpoet의 쿼리가 작동합니다. – RKh

+0

죄송합니다. :) 내 질문을 편집했습니다. – Justin