------------------------------
品名 单价 地域别
a 10 1
a 11 2
b 5 1
b 4 2
c 3 1
d 6 2
想要的结果:
如果给条件是True则显示:
------------------------------
品名 单价 地域别
a 10 1
b 5 1
c 3 1
d 6 2
如果给条件是False则显示:
------------------------------
品名 单价 地域别
a 11 2
b 4 2
c 3 1
d 6 2
就是说:①如果条件为真,同一种品名有两种单价就显示地域别为1的单价,
一种品名只有一种单价就不考虑地域别
②如果条件为假,同一种品名有两种单价就显示地域别为2的单价,
一种品名只有一种单价就不考虑地域别
------解决方案--------------------
--true
;with a1 (品名,单价,地域别) as
(
select 'a',10,1 union all
select 'a',11,2 union all
select 'b',5,1 union all
select 'b',4,2 union all
select 'c',3,1 union all
select 'd',6,2
)
,a2 as
(
select *,row_number() over(partition by 品名 order by 地域别) re from a1
)
select 品名,单价,地域别
from a2
where re=1
--False
;with a1 (品名,单价,地域别) as
(
select 'a',10,1 union all
select 'a',11,2 union all
select 'b',5,1 union all
select 'b',4,2 union all
select 'c',3,1 union all
select 'd',6,2
)
,a2 as
(
select *,row_number() over(partition by 品名 order by 地域别 desc) re from a1
)
select 品名,单价,地域别
from a2
where re=1
------解决方案--------------------
create table kc
(品名 varchar(5),单价 int,地域别 int)
insert into kc
select 'a',10,1 union all
select 'a',11,2 union all
select 'b',5,1 union all
select 'b',4,2 union all
select 'c',3,1 union all
select 'd',6,2
-- 如果给条件是True
declare @x varchar(10)
select @x='True'
select a.*
from kc a
where a.地域别=case @x when 'True' then 1
when 'False' then 2 end
or not exists
(select 1 from kc b where b.品名=a.品名 and b.地域别!=a.地域别)
/*
品名 单价 地域别
----- ----------- -----------
a 10 1
b 5 1
c 3 1
d 6 2
(4 row(s) affected)
*/
-- 如果给条件是False
declare @x varchar(10)
select @x='False'
select a.*
from kc a
where a.地域别=case @x when 'True' then 1
when 'False' then 2 end
or not exists
(select 1 from kc b where b.品名=a.品名 and b.地域别!=a.地域别)
/*
品名 单价 地域别