追索Allen

和别人不同,我喜欢写点实用的,喜欢就顶顶吧!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  12 随笔 :: 0 文章 :: 131 评论 :: 0 引用

看到网友yangyueming提出的第一个问题结果几个回答都存在不足,从而导致该网友又一次提出了专门解决第一个提问别人所回答的不足的地方

个人觉得这个问题还算比较经典所以决定用随笔写出来

一,地域表
Id 地域
1 中国
2 美国
3 英国
4 法国
....
二,产品表
产品Id 地域Id 产品名称
1 1 产品1
2 2 产品2
3 3 产品1
4 1 产品3
......

条件 1。产品在地域表中销售地域id来自地域表,如果在本区域销售则为Yes否则为No,2.地域表的值不固定
现在读成
  产品名称 中国 美国 英国 法国 ....
  产品1 Yes NO Yes No  
  产品2 No Yes No No
  产品3 Yes No No No

这个问题比较经典之处就是条件2地域表的值不固定,有可能有10个国家那就需要10列

而且还有一个关键性的地方就是就算动态生成了10列之后还得汇总,为什么呢

你可以看产品表 产品1号出现了两条而最终展示的结果是产品1号只有一条但有两个yes

我不知道我这样描述大家明白意思了没有

现在我给出了解决方案一

 

SQLServer代码
if object_id('country') is not null
drop table country
go
Create Table country
(
id
int null,
name
varchar(50) null
)
if object_id('Product') is not null
drop table Product
go
create table Product
(
id
int null,
countryid
int null,
name
varchar(50) null
)
insert Into country values(1,'中国');
insert Into country values(2,'美国');
insert Into country values(3,'英国');
insert Into country values(4,'法国');
insert Into country values(5,'日本');
Insert into Product values(1,1,'产品1');
Insert into Product values(2,2,'产品2');
Insert into Product values(3,3,'产品1');
Insert into Product values(4,1,'产品3');


go

declare @id varchar(100),@name varchar(100)
declare @sql varchar(max)

set @sql='select name'
declare name_zuisuo cursor for
select id,name from country
open name_zuisuo
fetch name_zuisuo into @id,@name
while @@fetch_status=0
begin

set @sql=@sql+'
,max(case when countryid=
'+char(39)+@id+char(39)+' then '+char(39)+'yes'+char(39)+'
else
'+char(39)+'no'+char(39)+' end) as '+char(39)+@name+char(39)+'
'
fetch name_zuisuo into @id,@name
end
close name_zuisuo
deallocate name_zuisuo

set @sql=@sql+' from product group by name'
exec (@sql)

 

有兴趣的朋友可以直接把代码复制到查询分析器中执行一下就可以看到效果

(注:地域表可随意增加,每增加一行最终结果就会多一列显示)


 由于时间仓促所以没有写注释,如需解释的地方还请留言

 

posted on 2010-11-23 16:44  追索  阅读(...)  评论(...编辑  收藏