Sql 如何按帐户代码长度计算帐户总数?
我有两张表:DimAccounts和FactBudget 例如:Sql 如何按帐户代码长度计算帐户总数?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有两张表:DimAccounts和FactBudget 例如: AccountKey AccountCode AccountName AccountGroup AccountType 1.6 1 6 1 NN 6 S 1.6 10 6 10 MMM 6 S 1.6 101 6 101
AccountKey AccountCode AccountName AccountGroup AccountType
1.6 1 6 1 NN 6 S
1.6 10 6 10 MMM 6 S
1.6 101 6 101 TTT 6 S
1.6 1010 6 1010 IIII 6 B
1.6 1011 6 1011 OOOO 6 B
1.6 1012 6 1012 KKK 6 B
事实预算示例:
TimeKey AccountKey Debit Credit
20110719 1.6 1010 20.00 5.00
20110719 1.6 1011 15.00 0.00
20110719 1.6 1000 5.00 0.00
20110719 1.6 1012 10.00 5.00
20110719 1.6 1112 10.00 0.00
事实上,预算是许多帐户只是与类型B。我需要得到借方和贷方的帐户类型S的总和总和
解决方案示例示例数据示例:
TimeKey AccountKey Debit Credit
20110719 1.6 1 60.00 10.00
20110719 1.6 10 50.00 10.00
20110719 1.6 101 45.00 10.00
要计算总额账户1.6 1017个符号的借方和贷方,我们需要将factbudget中的所有账户子串为7个符号1.6 1012->1.6 101,1.6 1112->1.6 111,1.6 1011->1.6 101,然后它们在哪里相等
1.6 101=1.6 101,按时间键和借贷总额分组
要计算合计科目1.615个符号和空格的借方和贷方,我们需要将factbudget中的所有科目子串为5个符号1.61012->1.61112->1.61111,1.61011->1.6101,1.61011->1.6101,然后它们在哪里相等
1.6 1=1.6 1按时间键和借方和贷方合计进行分组:依此类推
那么,如何通过TimeKey和AccountKey获取S帐户的借方和贷方金额呢?基本上,您可以采用并更改其中一个联接条件:
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 LIKE s.AccountCode + '%'
/* alternatively: ON s.AccountCode = LEFT(b.AccountCode, LEN(s.AccountCode)) */
INNER JOIN FactBudget f ON f.AccountKey = b.AccountKey
WHERE s.AccountType = 'S'
AND b.AccountType = 'B'
GROUP BY
f.TimeKey,
s.AccountKey
也许是这样的:
SELECT
FactBudget.TimeKey,
DimAccounts.AccountKey,
SUM(FactBudget.Debit) AS Debit,
SUM(FactBudget.Credit) AS Credit
FROM
DimAccounts
JOIN FactBudget
ON DimAccounts.AccountKey=
SUBSTRING(FactBudget.AccountKey,0,DATALENGTH(DimAccounts.AccountKey)+1)
WHERE
DimAccounts.AccountType='S'
GROUP BY
FactBudget.TimeKey,
DimAccounts.AccountKey
SELECT F.TimeKey,
D.AccountKey,
SUM(F.Debit) Debit,
SUM(F.Credit) Credit
FROM DimAccounts D
INNER JOIN FactBudget F ON F.AccountKey LIKE D.AccountKey + '%'
WHERE D.AccountType = 'S'
GROUP BY F.TimeKey,
D.AccountKey