2012-04-19 75 views
0

我有3個表:DimAccounts,DimTime和FactBudget。如何合計帳戶

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例如:

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 

在FactBudget許多帳戶只是B型我需要計算和借記卡信用總和,其中賬戶類型是S(總和)。列AccountFrom和AccountTo顯示B類型帳戶從哪裏開始總結(AccountFrom)和哪裏結束(AccountTo)。

我用Cursors製作瞭解決方案....但是你知道這很糟糕:)我認爲在FactBudget中組合數據(因爲在fa​​ctbudget和行600k中也有很多列)以及搜索解決方案時當我離開組只60K行):

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

因此,如何通過TimeKey和AccountKey得到的帳目借記卡和中房總和? (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型無帳戶!!!!我們需要得到它(例如1.11000只是日期20080523):

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 

但我需要每個日期的賬戶借方和貸方的總和。

+0

'AccountFrom'和'AccountTo'有什麼關係? – RedFilter 2012-04-19 17:25:05

+0

另外,你爲什麼要描述表'DimTime',在這裏似乎並不需要。 – RedFilter 2012-04-19 17:31:52

+1

是您在上面爲這兩個表格提供的帳戶密鑰是否正確?您的預期結果顯示1.10002,但該帳戶未顯示在您的FactBudget數據中? – Taryn 2012-04-19 18:01:18

回答

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 2012-04-19 19:46:42

+0

什麼是INNER JOIN DimAccounts b ON b.AccountCode?爲什麼沒有「b.AccountCode = s.aacouncode」。現在如何sql如何加入? – Justin 2012-04-19 19:56:32

+0

@Justin:讓我們嘗試以不同的方式來看待它,讓我們從'FactBudget'開始。您需要按帳戶和日期在'FactBudget'中對數據進行分組,對吧?但問題是,您需要按S型賬戶進行分組,而該表僅引用B型賬戶。現在,S型賬戶是B類型的父賬戶,對嗎?所以,對於每個B型賬戶,我們需要獲得其父母S型賬戶。包含這兩種類型的'DimAccounts'顯示了兩種類型是如何相互關聯的,即每個B型賬戶的* code *在S型的'AccountFrom'和'AccountTo'之間。 – 2012-04-20 05:40:15

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 2012-04-19 18:32:05

+0

對不起,我編輯了我的問題。 – Justin 2012-04-19 18:39:43