2012-04-19 6 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に多数の列があります) TimeKeyとAccountKeyによってSアカウントデビットとクレド合計を取得するにはどのように、そう

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

:とき、私はグループがちょうど60K行)を左?

ソリューションの例(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とはアカウントがありません!!!!

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アカウント借方と貸方の合計が必要になります。私たちは(ちょうど日付20080523たとえば1.11000)、それを取得する必要があります。

+0

「AccountFrom」と「AccountTo」はどの列が関連していますか? – RedFilter

+0

また、なぜあなたはテーブルDimTimeを記述していますか、ここでは必要ないようです。 – RedFilter

+1

は、上記の両方のテーブルに対して正しいアカウントキーですか?あなたの期待される結果は1.10002と表示されますが、そのアカウントはFactBudgetデータに表示されません。 – Taryn

答えて

0

私が見る限りでは、FactBudgetに設定して、最後に数字を取得するために、Bタイプアカウントを対応するSタイプアカウントに関連付けるためにDimAccountsに参加する必要があります。このようなもの:

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タイプのアカウントは、Bタイプの親アカウントの一種です。したがって、すべてのBタイプアカウントについて、その親Sタイプアカウントを取得する必要があります。そして、両方のタイプを含む 'DimAccounts'は、2つのタイプが互いにどのように関連しているか、すなわちBタイプのアカウントのすべての*コード*が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

関連する問題