日期:2014-05-17  浏览次数:20730 次

关于sql多重筛选
如:select 应付金额,项目名称 from tabname where ……  where 有多达10余个筛选,“应付金额”值根据筛选而有不同运算公式;
同时,又要列出不满足上述筛选条件,却要包含上述筛选结果中有的“项目名称”的所有记录(也就是要找出产生应付金额所属项目下的所有记录),并在同一个结果中反映出来。请问用何种方式可以达到要求,请给出示范语句(效率最高),谢谢。

------解决方案--------------------

--第二個問題:
select 应付金额,项目名称 from tabname where 项目名称 in 
(
select 项目名称 from tabname where
case when 应付金额 符合条件1 then 运算公式1 when 应付金额 符合条件2 then 运算公式2 when.... end 
)

------解决方案--------------------

--完整的
select 应付金额,项目名称 from tabname where
case when 应付金额 符合条件1 then 运算公式1 when 应付金额 符合条件2 then 运算公式2 when.... end 
union all
select 应付金额,项目名称 from tabname where 项目名称 in 
(
select 项目名称 from tabname where
case when 应付金额 符合条件1 then 运算公式1 when 应付金额 符合条件2 then 运算公式2 when.... end 
)
and not 
(
case when 应付金额 符合条件1 then 运算公式1 when 应付金额 符合条件2 then 运算公式2 when.... end 
)

------解决方案--------------------
我建议不要直接在where里面写判断,这样不易于sql server做出合适的执行计划,稍微改一下,可能更好


select 应付金额,项目名称
from
(
select 应付金额,项目名称,
       case when 应付金额 符合条件1 then 运算公式1 else 0 end as flag1,
       case when 应付金额 符合条件2 then 运算公式2 else 0 end as flag2,
       case when.... end  as flag10
from tabname
)t
where flag1 <>0 and flag2 <> 0...    --flag不为0表示满足条件

union all

select 应付金额,项目名称
from
(
select 应付金额,项目名称,
       case when 应付金额 符合条件1 then 运算公式1 else 0 end as flag1,
       case when 应付金额 符合条件2 then 运算公式2 else 0 end as flag2,
       case when.... end  as flag10
from tabname
)t
where flag1 =0 and flag2 = 0...    --flag为0表示不满足条件