昨天的sql存储过程没有解决的问题,望高手解惑。
df_fujiafei
ID 名称 费率 计算式 式 1 居民城市公用事业附加 .0120 NULL
2 其他城市公用事业附加 .0100 NULL
3 农网低压维护费 .0188 NULL
4 农网还贷基金 .0388 NULL
df_dianjia
id 名称 电压等级 用电性质 平电价 附加费
1 趸售(1-10kv0.393) 10kv 趸售 .3354 农网低压维护费;农网还贷基金
2 农业生产(1kv0.455) 小于1kv 农业生产 .3974 农网低压维护费;农网还贷基金
3 农业生产(1-10kv0.445) 1-10kv 农业生产 .4450
4 农业生产(35-110kv0.435) 5-110kv 农业生产 .4350
5 农业排灌(1kv0.22) 小于1kv 农业排灌 .1624 农网低压维护费;农网还贷基金
6 农业排灌(1-10kv0.215) 1-10kv 农业排灌 .2150
7 农业排灌(35-110kv0.21) 35-110kv 农业排灌 .2100
8 大工业(35-110kv0.315) 35-110kv 大工业 .3674 其他城市公用事业附加;农网低压维护费;农网还贷基金
例如:计算 大工业(35-110kv0.315) 附加费率和(我的思想是在df_ianfei找出附加费,然后在df_fujiafei中找出其中像对应的费率,比较分析所有的名称,把包含的费率找出来,然后求和。本人
的sql 语句用的不太熟,这个方法我认为逻辑上可以通过,但总是在做的时候有语法错误和一些奇妙的问题,请问大家有什么好的办法吗)
写的sql 如下:
35kvHeavyIndudtryElectNorm=isnull(case select 附加费 from df_dianjia where 名称='大工业(35-110kv0.315)' like (% 名称='居民城市公用事业附加'% then
select select 附加费 from df_dianjia where 名称='居民城市公用事业附加' from df_fujiafei where 名称='居民城市公用事业附加' ,0)
+isnull(case select 附加费 from df_dianjia where 名称='大工业(35-110kv0.315)' like (% 名称='其他城市公用事业附加'% then
select 费率 from df_fujiafei where 名称='其他城市公用事业附加' ,0)
+isnull(case select 附加费 from df_dianjia where 名称='大工业(35-110kv0.315)' like (% 名称='农网低压维护费'% then
select 费率 from df_fujiafei where 名称='农网低压维护费' ,0)
+isnull(case select 附加费 from df_dianjia where 名称='大工业(35-110kv0.315)' 名称 like '%农网还贷基金%' then
select 费率 from df_fujiafei where 名称='农网还贷基金' ,0)
问题点数:100、回复次数:7Top
1 楼deng1107(游戏人间(.net))回复于 2005-01-02 10:17:42 得分 50
楼主,我建设再建一个关联表,把附加值分开存入表中(dj_union),结构如
ID 电价ID,费率ID
再就用这三个联合查询就可以了
select sum(dj_fujiafei.费率) from dj_fujiafei inner join dj_union on dj_fujiafei.ID=dj_union.费率ID inner join dj_dianjia on dj_dianjia.ID=dj_union.电价ID
where dj_dianjia.电价名称='大工业(35-110kv0.315)'
Top
2 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-01-02 10:31:20 得分 50
如果只计算附加费,用以下的SQL语句即可:
select
c.id,
c.名称,
c.电压等级,
c.用电性质,
sum(c.平电价 * c.费率) as 附加费
from
(select
a.*,
isnull(b.费率,0) as 费率
from
df_dianjia a
left join
df_fujiafei b
on
charindex(b.名称,a.附加费)>0 ) c
group by
c.id,
c.名称,
c.电压等级,
c.用电性质Top
3 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-01-02 10:32:30 得分 0
如果只计算包括附加费之后的电费,用以下的SQL语句即可
select
c.id,
c.名称,
c.电压等级,
c.用电性质,
c.平电价+sum(c.平电价 * c.费率) as 总电费
from
(select
a.*,
isnull(b.费率,0) as 费率
from
df_dianjia a
left join
df_fujiafei b
on
charindex(b.名称,a.附加费)>0 ) c
group by
c.id,
c.名称,
c.电压等级,
c.用电性质,
c.平电价Top
4 楼deng1107(游戏人间(.net))回复于 2005-01-02 10:36:47 得分 0
如果按楼主那种思想在里面用游标做也能实现:
DECLARE @SearchKey --你要查询的电价名称
DECLARE feijiatatol_cursor CURSOR FOR
SELECT 名称 FROM dj_fujiafei --定义游标
DECLARE @Temp nvarchar(100) --用于暂存dj_dianjia中的附加费
DECLARE @35kvHeavyIndudtryElectNorm int --定义结果
set @35kvHeavyIndudtryElectNorm=0
set @SearchKey='大工业(35-110kv0.315)'
select @Temp=附加费 from dj_dianjia where 名称=@SearchKey
OPEN feijiatatol_cursor
FETCH NEXT FROM feijiatatol_cursor
WHILE @@FETCH_STATUS = 0
BEGIN
select @35kvHeavyIndudtryElectNorm=@35kvHeavyIndudtryElectNorm+isnull(费率,0) from dj_fujiafei where CHARINDEX(@temp,名称)>0
FETCH NEXT FROM feijiatatol_cursor
END
CLOSE feijiatatol_cursor
Top
5 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-01-02 10:38:07 得分 0
最后给你一个完整的:
------------------------------------------------------------
--生成测试数据
create table df_dianjia(
id int ,
名称 varchar(40),
电压等级 varchar(20),
用电性质 varchar(20),
平电价 numeric(8,4),
附加费 varchar(80)
)
create table df_fujiafei(
ID int,
名称 varchar(20),
费率 numeric(8,4),
计算式 varchar(10)
)
insert into df_fujiafei values(1,'居民城市公用事业附加' ,.0120 ,NULL)
insert into df_fujiafei values(2,'其他城市公用事业附加' ,.0100 ,NULL)
insert into df_fujiafei values(3,'农网低压维护费' ,.0188 ,NULL)
insert into df_fujiafei values(4,'农网还贷基金' ,.0388 ,NULL)
insert into df_dianjia values(1 ,'趸售(1-10kv0.393)' ,'10kv' ,'趸售' ,.3354 ,'农网低压维护费;农网还贷基金' )
insert into df_dianjia values(2 ,'农业生产(1kv0.455)' ,'小于1kv' ,'农业生产' ,.3974 ,'农网低压维护费;农网还贷基金' )
insert into df_dianjia values(3 ,'农业生产(1-10kv0.445)' ,'1-10kv' ,'农业生产' ,.4450 ,null )
insert into df_dianjia values(4 ,'农业生产(35-110kv0.435)','5-110kv' ,'农业生产' ,.4350 ,null )
insert into df_dianjia values(5 ,'农业排灌(1kv0.22)' ,'小于1kv' ,'农业排灌' ,.1624 ,'农网低压维护费;农网还贷基金' )
insert into df_dianjia values(6 ,'农业排灌(1-10kv0.215)' ,'1-10kv' ,'农业排灌' ,.2150 ,null )
insert into df_dianjia values(7 ,'农业排灌(35-110kv0.21)' ,'35-110kv' ,'农业排灌' ,.2100 ,null )
insert into df_dianjia values(8 ,'大工业(35-110kv0.315)' ,'35-110kv' ,'大工业' ,.3674 ,'其他城市公用事业附加;农网低压维护费;农网还贷基金')
--按df_dianjia表名称字段统计总电费的SQL语句[精确到小数点后四位]
select
c.id,
c.名称,
c.电压等级,
c.用电性质,
cast(round(c.平电价+sum(c.平电价 * c.费率),4) as numeric(8,4)) as 总电费
from
(select
a.*,
isnull(b.费率,0) as 费率
from
df_dianjia a
left join
df_fujiafei b
on
charindex(b.名称,a.附加费)>0 ) c
group by
c.id,
c.名称,
c.电压等级,
c.用电性质,
c.平电价
--删除测试数据及表
drop table df_dianjia
drop table df_fujiafeiTop
6 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-01-02 10:43:28 得分 0
最后的输出结果如下:
id 名称 电压等级 用电性质 总电费
---------------------------------------------------------
1 趸售(1-10kv0.393) 10kv 趸售 .3547
2 农业生产(1kv0.455) 小于1kv 农业生产 .4203
3 农业生产(1-10kv0.445) 1-10kv 农业生产 .4450
4 农业生产(35-110kv0.435)5-110kv 农业生产 .4350
5 农业排灌(1kv0.22) 小于1kv 农业排灌 .1718
6 农业排灌(1-10kv0.215) 1-10kv 农业排灌 .2150
7 农业排灌(35-110kv0.21) 35-110kv 农业排灌 .2100
8 大工业(35-110kv0.315) 35-110kv 大工业 .3922Top
7 楼happying(口袋)回复于 2005-01-02 11:16:20 得分 0
谢谢libin_ftsafe(子陌红尘) , deng1107(用.NET编程) !
libin_ftsafe:我现在用的方法和你方法相似
deng1107:很谢谢你帮助我实现了,我最初的思想Top




