当前位置: 代码迷 >> Sql Server >> 请问列转横后,再和另一表合并,sql怎样写
  详细解决方案

请问列转横后,再和另一表合并,sql怎样写

热度:72   发布时间:2016-04-24 08:59:52.0
请教列转横后,再和另一表合并,sql怎样写?
--建立测试环境 
  
 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 区域名称

------解决思路----------------------
只要列转换好了,再联合另一表,就简单多了.

再套一层就是.
  相关解决方案