如何建立关于公式计算的表(欢迎牛人讨论)

kuangdp 2008-01-11 04:44:39

已知TB_A

如:知道每个XID每天的一个VALUE
XID VALUE date1
001 2000 2007-09-10
001 3000 2007-09-11
001 2040 2007-09-12
001 3010 2007-09-13
002 2100 2007-09-10
002 3070 2007-09-11
002 2140 2007-09-12
002 3310 2007-09-13
003 2103 2007-09-10
003 3071 2007-09-11
003 2145 2007-09-12
003 3318 2007-09-13

要通过一个公式 来计算 另一个指标,如下:

A每天的VALUE=001的VALUE*60%+002的VALUE*40%
B每天的VALUE=001的VALUE*30%+002的VALUE*50%+003的VALUE*20%
……

目前知道这个公式,为了得到这个指标,应该如果建立这个公式表呢
不知道哪位仁兄做过此类的计算,有任何建议都可以在这里探讨一下~~~WELCOME!
...全文
124 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangdp 2008-01-14
  • 打赏
  • 举报
回复
loworth的办法,很不错呀,不过可能只能针对计算类似这种占比的公式;
就象JL99000 所说
是否有好的函数或者动态语句能够灵活实现此类问题呢?!期待ING~
loworth 2008-01-13
  • 打赏
  • 举报
回复
/*再建一个表   TB_B*/ 
CREATE TABLE [TB_B]
(
shuju varchar(10) not null,--存放诸如A、B、C之类的数据
XID VARCHAR(3) not null, --与TB_A表外键关联
per int not null --存放百分比的字段
)
go
/*插入测试数据*/
INSERT INTO [TB_B]
SELECT 'A','001',60
UNION SELECT 'A','002',40
UNION SELECT 'B','001',30
UNION SELECT 'B','002',50
UNION SELECT 'B','003',20
--......等等
/*那么在查询的时候可以这么做*/

SELECT [TB_B].[shuju],SUM([TB_B].[per]*[TB_A].[VALUE])/100--正确结果未必是整数,如果保留整数就这么做,如果需要留小数则 CAST(SUM([table_b].[per]*[TB_A].[VALUE]) AS DECIMAL(9,2))/100 其中的2可换成要保留的位数
FROM [TB_A] JOIN [TB_B] ON [TB_A].[XID]=[TB_B].[XID]
GROUP BY [TB_B].[shuju]
loworth 2008-01-13
  • 打赏
  • 举报
回复
/*再建一个表 TB_B*/
CREATE TABLE [TB_B]
(
shuju varchar(10) not null,--存放诸如A、B、C之类的数据
XID VARCHAR(3) not null, --与TB_A表外键关联
per int not null --存放百分比的字段
)
go
/*插入测试数据*/
INSERT INTO [TB_B]
SELECT 'A','001',60
UNION SELECT 'A','002',40
UNION SELECT 'B','001',30
UNION SELECT 'B','002',50
UNION SELECT 'B','003',20
--......等等
/*那么在查询的时候可以这么做*/

SELECT [TB_B].[shuju],SUM([TB_B].[per]*[TB_A].[VALUE])/100--正确结果未必是整数,如果保留整数就这么做,如果需要留小数则 CAST(SUM([table_b].[per]*[TB_A].[VALUE]) AS DECIMAL(9,2))/100 其中的2可换成要保留的位数
FROM [TB_A] JOIN [TB_B] ON [TB_A].[XID]=[TB_B].[XID]
GROUP BY [TB_B].[shuju]


kuangdp 2008-01-12
  • 打赏
  • 举报
回复
TO JL99000 :
这个不使用程序来做的,要在数据库中做,我觉得是通过 happyflystone 的动态SQL来处理
或者定义一个函数,函数里用动态SQL来处理 这个公式的计算,
比如通过公式对应表, 传一个 A ,一个日期参数DATE1,就可以 在函数中套用公式来计算了 ,返回一个值就是A的DATE1日期的指标值
现在就是 我如何定义这个公式这个字段的格式,拿不准确,不知道如何好
001;VALUE*60%;002;VALUE*40% ,或者
;001*60%;002*40%; ,我想用这个来处理,去找(; *)中间的值,然后可以通过传入的DATE1来找对应的这个001这天的VALUE,然后用动态语句计算每个;的指标的值的相加,得到结果
还希望听听别人处理过此类问题的经验,有没有更好的解决方法,最好能提供出解决的SQL例子,HOHO~
JL99000 2008-01-12
  • 打赏
  • 举报
回复
我以前做过这方面的,不过比你这个复杂的多:

你可以将另一个指标值所对应的公式存储在一张表中,公式的格式类似于这种的
([1944]-[1934]-[1924]-[1954]*1.8)/[1944]*100
[ ]内存放数据源所对应的ID
这样解吸公式来算出结果(这里可以用一个服务来做,可以每天自动计算),将结果放在指标值字段对应的value上就OK了
JL99000 2008-01-12
  • 打赏
  • 举报
回复
用SQL语句来找你要的001,002很难,因为SQL语句比较低级,有很多功能像C#直接就能实现的,在SQL这要很麻烦
我的建议还是计算在应用层来做
我们的项目就是这么做的

而且跟你说个问题吧:
你想过你的公式会有其他形式嘛,万一以后要添加这样的公式:求AVG的,平方跟,等等吧,你难道还要改很多代码吗
用应用层的代码可以设计模式,这样出现特殊的公式,只需要继承抽象类,改一下计算方法就OK了

哎!说到设计模式去了
HOHO

kuangdp 2008-01-11
  • 打赏
  • 举报
回复
001 ; VALUE*60% ; + ; 002 ; VALUE*40%
这样,如果动态实现这个公式的计算呢 ?!
通过分号来判断,第一个前面的表示关联的XID ,第二个 通过日期再找到VALUE?
还有可能 002 找不到对应每天的数据的情况,这个时候我就应该算001 ; VALUE*60% ;
这个动态语句似乎也不好实现哦
-狙击手- 2008-01-11
  • 打赏
  • 举报
回复
table:

col1 col2
A 001 ; VALUE*60% ; + ; 002 ; VALUE*40%
B 001 ; VALUE*30% ; + ; 002 ; VALUE*50% ; + ; 003 ; VALUE*20%

分析col2
kuangdp 2008-01-11
  • 打赏
  • 举报
回复
不是,就是A每天的value 是通过公式 来计算的
如:A 2007-09-10 的值 = 2000*60% + 2100*40%

to :无枪狙击手
能不能再详细点?

一者仁心 2008-01-11
  • 打赏
  • 举报
回复
value=001的value的总和?还是怎样
-狙击手- 2008-01-11
  • 打赏
  • 举报
回复
你保存成串,在过程中分解后用动态SQL

22,207

社区成员

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

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