create table test(产品 varchar(10),颜色 varchar(10),数量 int)
insert test select '产品1','红色',123
insert test select '产品1','蓝色',126
insert test select '产品2','蓝色',103
insert test select '产品2','红色',NULL
insert test select '产品2','红色',89
insert test select '产品1','红色',203
--1
select 产品,sum(a)
from
(
select 产品,-数量 as a
from test
where 颜色='蓝色'
union all
select 产品,数量 as a
from test
where 颜色='红色'
) as b
group by 产品
having sum(a)>0
--2
select 产品,红色=sum(case when 颜色='红色' then 数量 else 0 end),
蓝色=sum(case when 颜色='蓝色' then 数量 else 0 end) from test group by 产品
--表怪怪的
1.
select a.产品,(红-蓝) from (select 产品,sum(数量) as 红 from test where 颜色='红色' group by 产品) a
left join (select 产品,sum(数量) as 蓝 from test where 颜色='蓝色' group by 产品) b
on a.产品=b.产品
如果只有两种颜色也可以这样:
1:
select 产品,sum(IsNull(数量,0) * Replace(replace(颜色,'红色',1),'蓝色',-1))
from test
group by 产品
having sum(IsNull(数量,0) * Replace(replace(颜色,'红色',1),'蓝色',-1))>0
2:
select 产品,sum(IsNull(数量,0) * Replace(replace(颜色,'红色',1),'蓝色',0))
,sum(IsNull(数量,0) * Replace(replace(颜色,'红色',0),'蓝色',1))
from test
group by 产品
having sum(IsNull(数量,0) * Replace(replace(颜色,'红色',1),'蓝色',-1))>0
1
or:
select 产品,sum(case when 颜色='红色' then 数量 when 颜色='蓝色' then -数量 else 0 end) as 差额
from test
group by 产品
having sum(case when 颜色='红色' then 数量 when 颜色='蓝色' then -数量 else 0 end)>0
select 产品,sum(case when 颜色='红色' then 数量 else 0 end)-sum(case when 颜色='蓝色' then 数量 else 0 end) as 差额
from test
group by 产品
having sum(case when 颜色='红色' then 数量 else 0 end)>sum(case when 颜色='蓝色' then 数量 else 0 end)
2。按产品分类,将数据按下列方式进行统计显示
create table test(产品 varchar(10),颜色 varchar(10),数量 int)
insert test select '产品1','红色',123
insert test select '产品1','蓝色',126
insert test select '产品2','蓝色',103
insert test select '产品2','红色',NULL
insert test select '产品2','红色',89
insert test select '产品1','红色',203
select * from test
select 产品,红色=sum(case when 颜色='红色' then 数量 else 0 end),
蓝色=sum(case when 颜色='蓝色' then 数量 else 0 end) from test group by 产品