一个棘手的客户需求难题

dearbinge 2011-07-19 04:33:21
有一个科目余额表
大概用到的字段:
FACCOUNTI(科目内码),
FDEBIT(借方发生额),
FCREDIT(贷方发生额),
FYTDCREDIT(本年累计借方发生额),
FYTDCREDIT(本年贷方累计发生额),
FENDBALANCE(本期余额)
现在我想做个报表,报表有一个取数规则:例如1102 + 1103 (1102科目的FDEBIT加上1103的FCREDIT),但是这个取数规则用户是可以修改的,也可以是1102 + 1103 - 1110,
我该如何去设计数据表及怎样才能取出对应的数据?各位能否提供个思路?
...全文
220 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Q315054403 2011-07-21
  • 打赏
  • 举报
回复
先求出各明细结果,再动态组合,SP or 前端均方便执行
aXen 2011-07-20
  • 打赏
  • 举报
回复
增加一个字段来存储运算有关系?
aXen 2011-07-20
  • 打赏
  • 举报
回复
顶一下,都是数据库大牛们。
dearbinge 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 fredrickhu 的回复:]

需要建立一个码表来专门存储规则 这个表存储的规则有ID 其他的表在取的时候都对应这个码表的ID

码表中的字段可以单选 可以多选
[/Quote]
那运算关系怎么存储的?
--小F-- 2011-07-19
  • 打赏
  • 举报
回复
需要建立一个码表来专门存储规则 这个表存储的规则有ID 其他的表在取的时候都对应这个码表的ID

码表中的字段可以单选 可以多选
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
小F、叶子大版等大神呢?给点意见吗。
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
还有木有其他意见的?
AcHerat 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dearbinge 的回复:]

引用 11 楼 cd731107 的回复:
设置某一个字段col存贮下面的字符串值

SQL code
'(select FDEBIT where FACCOUNTID=1000)+(select FCREDIT where FACCOUNTID=1001')
exec('select '+col)

恩 这想法吧错!
[/Quote]

这就一条语句搞不出了,楼主建存储过程去写吧!
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cd731107 的回复:]
设置某一个字段col存贮下面的字符串值

SQL code
'(select FDEBIT where FACCOUNTID=1000)+(select FCREDIT where FACCOUNTID=1001')
exec('select '+col)
[/Quote]
恩 这想法吧错!
cd731107 2011-07-19
  • 打赏
  • 举报
回复

设置某一个字段col存贮下面的字符串值

'(select FDEBIT where FACCOUNTID=1000)+(select FCREDIT where FACCOUNTID=1001')
exec('select '+col)
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 acherat 的回复:]
1结果:1000的FDEBIT + 1001的FCREDIT (正确结果:6900203.45)
2结果:1004的FDEBIT + 1001的FCREDIT - 1005的FENDBALANCE (正确结果:5712844.45)

纠结中。。。如果是 1001+1000+1005-1006呢?。。。
[/Quote]
恩,是啊,这些都是用户自定义的,具有灵活性。只不过要等用户全部定义完成我们才可以取数。
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
我们负责把这些用户的取数规则整合到数据库,然后在根据规则取数的。
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acherat 的回复:]

1结果:1000的FDEBIT + 1001的FCREDIT (正确结果:6900203.45)
2结果:1004的FDEBIT + 1001的FCREDIT - 1005的FENDBALANCE (正确结果:5712844.45)
……

楼主是不是结果给错了,怎么一个是按fcredit算,一个是fdebit啊!
[/Quote]
没有哦,这个取数规则是自定义的,可以是科目的借方发生额,也可以是贷方发生额、借方累计发生额、贷方累计发生额、本期余额。根据每个取数规则这些都是可以改变的,像1000的FDEBIT + 1001的FCREDIT、1004的FDEBIT + 1001的FCREDIT - 1005的FENDBALANCE这些都是用户自定义的取数规则。
AcHerat 2011-07-19
  • 打赏
  • 举报
回复


1结果:1000的FDEBIT + 1001的FCREDIT (正确结果:6900203.45)
2结果:1004的FDEBIT + 1001的FCREDIT - 1005的FENDBALANCE (正确结果:5712844.45)

纠结中。。。如果是 1001+1000+1005-1006呢?。。。
AcHerat 2011-07-19
  • 打赏
  • 举报
回复

create table #temp_balance
(
faccountid int,
fdebit decimal(13,2),
fcredit decimal(13,2),
fytddebit decimal(13,2),
fytdcredit decimal(13,2),
fendbalance decimal(13,2)
)
go

insert into #temp_balance
select 1000,327359.00,328989.82,327359.00,328989.82,40250.63
union all
select 1001,7509115.10,6572844.45,7509115.10,6572844.45,9366373.50
union all
select 1004,0.00,0.00,0.00,0.00,1000000.00
union all
select 1005,6919858.13,7508525.00,6919858.13,7508525.00,43790107.43
union all
select 1006,0.00,0.00,0.00,0.00,-860000.00
union all
select 1009,201861.64,285499.59,201861.64,285499.59,1289985.48
union all
select 1011,5659809.04,4207507.22,5659809.04,4207507.22,9010930.77
union all
select 1014,4629674.33,4182286.37,4629674.33,4182286.37,836511.24
union all
select 1015,312136.43,85802.36,312136.43,85802.36,336651.40
union all
select 1017,3999585.68,4175146.27,3999585.68,4175146.27,480897.94
go

declare @sql varchar(100)
set @sql = '1000+1001'
set @sql = (case left(@sql,1) when '-' then '-' else '+' end)+replace(replace(@sql,'+',',+'),'-',',-')

select isnull((select sum(fcredit) from #temp_balance where charindex(',+'+ltrim(faccountid)+',',','+@sql+',') > 0),0)
- isnull((select sum(fcredit) from #temp_balance where charindex(',-'+ltrim(faccountid)+',',','+@sql+',') > 0),0)

drop table #temp_balance

/**********

---------------------------------------
6901834.27
AcHerat 2011-07-19
  • 打赏
  • 举报
回复
1结果:1000的FDEBIT + 1001的FCREDIT (正确结果:6900203.45)
2结果:1004的FDEBIT + 1001的FCREDIT - 1005的FENDBALANCE (正确结果:5712844.45)
……

楼主是不是结果给错了,怎么一个是按fcredit算,一个是fdebit啊!
dearbinge 2011-07-19
  • 打赏
  • 举报
回复
给出测试数据,朋友们帮忙看下,THKS

IF OBJECT_ID(N'TEMPDB..#TEMP_BALANCE') IS NOT NULL
DROP TABLE #TEMP_BALANCE
GO

CREATE TABLE #TEMP_BALANCE
(
FACCOUNTID INT,
FDEBIT DECIMAL(13,2),
FCREDIT DECIMAL(13,2),
FYTDDEBIT DECIMAL(13,2),
FYTDCREDIT DECIMAL(13,2),
FENDBALANCE DECIMAL(13,2)
)
GO

INSERT INTO #TEMP_BALANCE
SELECT 1000,327359.00,328989.82,327359.00,328989.82,40250.63
UNION ALL
SELECT 1001,7509115.10,6572844.45,7509115.10,6572844.45,9366373.50
UNION ALL
SELECT 1004,0.00,0.00,0.00,0.00,1000000.00
UNION ALL
SELECT 1005,6919858.13,7508525.00,6919858.13,7508525.00,43790107.43
UNION ALL
SELECT 1006,0.00,0.00,0.00,0.00,-860000.00
UNION ALL
SELECT 1009,201861.64,285499.59,201861.64,285499.59,1289985.48
UNION ALL
SELECT 1011,5659809.04,4207507.22,5659809.04,4207507.22,9010930.77
UNION ALL
SELECT 1014,4629674.33,4182286.37,4629674.33,4182286.37,836511.24
UNION ALL
SELECT 1015,312136.43,85802.36,312136.43,85802.36,336651.40
UNION ALL
SELECT 1017,3999585.68,4175146.27,3999585.68,4175146.27,480897.94

SELECT * FROM #TEMP_BALANCE

客户需求报表:

1结果:1000的FDEBIT + 1001的FCREDIT (正确结果:6900203.45)
2结果:1004的FDEBIT + 1001的FCREDIT - 1005的FENDBALANCE (正确结果:5712844.45)
……
……
像结果后面的取数规则是由客户自己定义的,我们只负责按照他的规则取出数据,我的问题是该如何存储用户的取数规则以及正确得到相应的结果。

spiritofdragon 2011-07-19
  • 打赏
  • 举报
回复
建个规则表吧。
FACCOUNTI,字段,运算符(也可以是正负号,或者系数)
'1102','FDEBIT','1'
'1103','FCREDIT','1'
'1110','FCREDIT','-1'

变量这个表,拼出类似的串。
(select (1)*FDEBIT from 表 where FACCOUNTI='1102')
+(select (1)*FCREDIT from 表 where FACCOUNTI='1103')
+(select (-1)*FCREDIT from 表 where FACCOUNTI='1110')
红色都是读规则表拼的。
执行动态sql。
AcHerat 2011-07-19
  • 打赏
  • 举报
回复
可否借助数据来具体说明下!
cd731107 2011-07-19
  • 打赏
  • 举报
回复
把这个1102 + 1103的规则存放在表中,如有修改则更新
用时,从表中取出,利用动态语句执行

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧