首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL2005竖横表处理难题,请出手

2013-11-25 
SQL2005竖横表处理难题,请大虾出手!请问SQL2005数据库如何把1源表处理成2一样的结果?谢谢!例子如下:1、源表

SQL2005竖横表处理难题,请大虾出手!
请问SQL2005数据库如何把1源表处理成2一样的结果?谢谢!
例子如下:
1、源表
项目   产品   价格 (注:项目是动态变的可能有多项,比如有20个广东)    
------------------
广东   a      1
广东   b      3
广东   c      10
广西   a      5
中国   f      9
中国   g      8

2、处理后的结果
项目   产品   价格  产品   价格   产品   价格  
-----------------------------------------------
广东   a      1      b      3      c      10
广西   a      5
中国   f      9     g      8

SQL?竖横表处理
[解决办法]

----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2013-11-22 15:21:03
-- Verstion:
--      Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
--Feb 10 2012 19:39:15 
--Copyright (c) Microsoft Corporation
--Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([项目] varchar(4),[产品] varchar(1),[价格] int)
insert [tb]
select '广东','a',1 union all
select '广东','b',3 union all
select '广东','c',10 union all
select '广西','a',5 union ALL
select '中国','f',9 union all
select '中国','g',8
--------------开始查询--------------------------
--declare @s nvarchar(4000)
--set @s=''
--Select     @s=@s+',''产品''=max(case when [px]='+quotename([px],'''')+' then [产品] else '''' end),''价格''=max(case when [px]='+quotename([px],'''')+' then [价格] else '''' end)'

--from (SELECT  px=ROW_NUMBER()OVER(PARTITION BY 项目 ORDER BY GETDATE()),产品,价格 FROM tb )AS a group BY a.px,产品,价格

 
--exec('select [项目]'+@s+' from (SELECT px=ROW_NUMBER()OVER(PARTITION BY 项目 ORDER BY GETDATE()),* FROM tb )AS a group by [项目]')



declare @sql varchar(8000)
set @sql = 'select 项目 '
select @sql = @sql + ' , max(case px when ''' + LTRIM(px) + ''' then 产品 else '''' end) as 产品,max(case px when ''' + LTRIM(px) + ''' then 价格 else '''' end) as 价格'
from (select distinct px from (SELECT  px=ROW_NUMBER()OVER(PARTITION BY 项目 ORDER BY GETDATE()),* FROM tb )AS a ) as a
set @sql = @sql + ' from (SELECT  px=ROW_NUMBER()OVER(PARTITION BY 项目 ORDER BY GETDATE()),* FROM tb )AS a  group by 项目'
exec(@sql) 
----------------结果----------------------------
/* 项目   产品   价格          产品   价格          产品   价格
---- ---- ----------- ---- ----------- ---- -----------
广东   a    1           b    3           c    10
广西   a    5                0                0
中国   f    9           g    8                0

(3 行受影响)
*/

[解决办法]
这么久都没人回答 逆天了
[解决办法]



if object_id('tab') is not null drop table tab


go 
create table tab
(
项目 varchar(20),产品 varchar(10),价格 int
)

insert tab
select '广东',   'a',      1
union all select '广东',   'b',      3
union all select '广东',   'c',      10
union all select '广西',   'a',      5
union all select '中国',   'f',      9
union all select '中国',   'g',      8


declare @sql nvarchar(3000);

set @sql = '';


;with t
as
(
select *,
       ROW_NUMBER() over(partition by 项目 order by 产品 ) as rownum
from tab
)

select @sql = 
   @sql + ',min(case when rownum = '+CAST(rownum as varchar)+ ' then 产品 else null end) as 产品'+
          ',min(case when rownum = '+CAST(rownum as varchar)+ '  then 价格 else null end) as 价格'
from t
group by rownum



select @sql = 'select 项目'+@sql +
              ' from (select *,
                ROW_NUMBER() over(partition by 项目 order by 产品 ) as rownum
                from tab)t group by 项目'

--select @sql       
exec(@sql)       
/*
项目产品价格产品价格产品价格
广东a1b3c10
广西a5NULLNULLNULLNULL
中国f9g8NULLNULL
*/

热点排行