没分了,不过还是请高手看一下这个问题,比较想不通~~~
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 无效.