--建立测试环境
Create Table 总表(区域名称 varchar(100),区域类型 varchar(100),区域价格说明 varchar(100))
--插入数据
insert into 总表
select '1长春','标准全球通定制1','0.15每分钟'
select '2吉林','标准全球通定制2','0.11每分钟'
go
Create Table 表(区域 varchar(100),类型 varchar(100),说明 varchar(100))
--插入数据
insert into 表
select '1长春','1.标准全球通','1分0.5' union
select '1长春','2.全球通资费套餐','1分0.7' union
select '1长春','3.全球通优惠','1分0.9' union
select '1长春','1.标准全球通','1分0.6' union
select '2吉林','1.标准全球通','1分0.5' union
select '2吉林','2.全球通资费套餐','1分0.7' union
select '2吉林','3.全球通优惠','1分0.9' union
select '2吉林','3.全球通优惠','1分1.1'
--我想出的列表:
--区域名称 区域类型 区域价格说明 1.标准全球通 2.全球通资费套餐 3.全球通优惠
--1长春 标准全球通定制1 0.15每分钟 1分0.5,1分0.6 1分0.7 1分0.9
--2吉林 标准全球通定制2 0.11每分钟 1分0.5 1分0.7 1分0.9,1分1.1
------解决思路----------------------
select 区域名称,区域类型,区域价格说明,[1.标准全球通],[2.全球通资费套餐],[3.全球通优惠]
from 总表 A left join
(
select 区域,类型,stuff((select ','+说明 from 表 where 区域=A.区域 and 类型=A.类型
for xml path('')),1,1,'') As X from 表 A
Group by
区域,类型
) B on A.区域名称=B.区域
pivot
(
max(X)
For
类型 in ([1.标准全球通],[2.全球通资费套餐],[3.全球通优惠])
)P
------解决思路----------------------
2005以前用CASE WHEN + MAX
2005以后可用PIVOT,XML等
------解决思路----------------------
--动态
DECLARE @SQL VARCHAR(MAX)
SET @SQL='SELECT 区域名称,区域类型,区域价格说明'
SELECT @SQL=@SQL+',STUFF((SELECT '',''+说明 FROM 表 T2 WHERE T1.区域名称=T2.区域 AND T2.类型='''+类型+'''FOR XML PATH('''')),1,1,'''')['+类型+']'
FROM 表 GROUP BY 类型
SET @SQL=@SQL+'FROM 总表 T1 GROUP BY 区域名称,区域类型,区域价格说明 ORDER BY 区域名称'
PRINT @SQL
EXEC(@SQL)
--静态
SELECT 区域名称,区域类型,区域价格说明
,STUFF((SELECT ','+说明 FROM 表 T2 WHERE T1.区域名称=T2.区域 AND T2.类型='1.标准全球通'FOR XML PATH('')),1,1,'')[1.标准全球通]
,STUFF((SELECT ','+说明 FROM 表 T2 WHERE T1.区域名称=T2.区域 AND T2.类型='2.全球通资费套餐'FOR XML PATH('')),1,1,'')[2.全球通资费套餐]
,STUFF((SELECT ','+说明 FROM 表 T2 WHERE T1.区域名称=T2.区域 AND T2.类型='3.全球通优惠'FOR XML PATH('')),1,1,'')[3.全球通优惠]
FROM 总表 T1
GROUP BY 区域名称,区域类型,区域价格说明
ORDER BY 区域名称
------解决思路----------------------
只要列转换好了,再联合另一表,就简单多了.
再套一层就是.