日期:2014-05-18  浏览次数:20487 次

没分了,不过还是请高手看一下这个问题,比较想不通~~~
ALTER         proc   zjreport_case
      (
        @cname   varchar(1000)=null,
        @sdate   datetime=null,
        @edate   datetime=null
        )
as  
begin
select   aa.公司名称zy   as   公司名称,sum(审批金额)   as   审批金额,sum(批复金额)   as   批复金额   from  
(
select   *   from  
(
  select   公司名称,公司id,审批金额,批复金额,审批意见,请求时间,gsid     from   a
  union   all
  select   公司名称,公司id,审批金额,批复金额,审批意见,请求时间,gsid     from   b
)   tt1
  where     审批意见= '同意 '  
/*   ------------------------   */
and     @cname   is   null   or   @cname   =   '0 '     or   gsid     in   (
select   gsid   from   duizhaobiao   where   zyid   in   (select   zyid   from   duizhaobiao   where     charindex( ', '+rtrim(gsid)+ ', ', ', '+@cname+ ', ')> 0)  
)
/*   ------------------------   */
and   请求时间> (case   when   @sdate   is   null   then   请求时间-1   else   @sdate   end)
and   请求时间 <(case   when   @edate   is   null   then   请求时间+1   else   @edate   end)
)tt   ,duizhaobiao   aa   where   tt.公司id   =   aa.gsid   group   by   aa.公司名称zy
end
GO

--------------------------
这是我的存储过程~~~~

在查询分析器中运行时

1.当输入条件cname   is   null时,产生的数据如下:
a汽销     98159560.9500 85159560.9500
b分公司 21135910.0000 21135910.0000
有一个返回的警告信息:
警告:   聚合或其它   SET   操作消除了空值。

2.当输入条件cname   =   '0 '   时,产生的数据如下:
a汽销                 103426960.9500     90426960.9500
b分公司 22624386.0000 22624386.0000

有一个返回的警告信息:
警告:   聚合或其它   SET   操作消除了空值。

3.当输入条件cname   为具体值时,产生的数据如下:
a汽销           103426960.9500 90426960.9500

没有返回警告信息~~~~

输入条件is   null   或是   cname   =   '0 '   时实际上取出的数据是全部的,搞不懂为什么条件不同得出的数据会不相等呢,理论上同一家公司取出的汇总数据是应该相等的~~

问题全部出在这一部份上了:

and     @cname   is   null   or   @cname   =   '0 '     or   gsid     in   (
select   gsid   from   duizhaobiao   where   zyid   in   (select   zyid   from   duizhaobiao   where     charindex( ', '+rtrim(gsid)+ ', ', ', '+@cname+ ', ')> 0)  
)


但搞不懂为什么会有这种情况产生,高手能不能帮忙分析一下啊,有什么解决办法吗?
郁闷~~~




------解决方案--------------------
呵呵,
将类似 sum(审批金额) as 审批金额 的语句改为:
sum(isnull(审批金额,0)) as 审批金额
就不会出现这个警告了.试试吧.

------解决方案--------------------
呵呵,and 与 or 连用时,要注意加括号呀.
xxx and xxx or xxx or xxx
改成:
xxx and (xxx or xxx or xxx )
不加括号的话,and 无效.