CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

昨天的sql存储过程没有解决的问题,望高手解惑。

楼主happying(口袋)2005-01-02 09:40:33 在 MS-SQL Server / 基础类 提问

 
  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

相关问题

  • SQL server的存储过程
  • SQL Server存储过程
  • sql存储过程问题
  • Oracle的存储过程与MS SQL Server的存储过程
  • Oracle的存储过程如何转成SQL Server存储过程
  • 求教,SQL存储过程移植到——oracle存储过程。
  • 关于sql server 7.0的存储过程
  • SQL存储过程的写法问题
  • 关于sql server 和存储过程
  • Ado调用Sql server7.0存储过程

关键词

  • sql
  • 维护
  • null
  • kv
  • 排灌
  • 附加费
  • 农业
  • 名称
  • 费
  • 低压维护

得分解答快速导航

  • 帖主:happying
  • deng1107
  • libin_ftsafe

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo