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

行转列有关问题

2012-04-27 
行转列问题求助行转列问题求助数据如下col1 col2A1A2B3B4如何得到col1 ,col21,col22A12B34[解决办法]SQL c

行转列问题求助
行转列问题求助

数据如下
col1 col2
A 1
A 2
B 3
B 4

如何得到
col1 ,col21,col22
A 1 2
B 3 4

[解决办法]

SQL code
CREATE TABLE tbc(    col1 VARCHAR(10),    col2 INT)GOINSERT INTO tbcSELECT 'A', 1 UNION SELECT 'A', 2 UNION SELECT 'B', 3 UNION SELECT 'B', 4WITH table1 AS (SELECT col1,col2,num=ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2)FROM tbc)SELECT    DISTINCT col1,        (SELECT col2 FROM table1 AS tbaa WHERE tbaa.col1 = tbbb.col1 AND tbaa.num = 1) AS col21,        (SELECT col2 FROM table1 AS tbaa WHERE tbaa.col1 = tbbb.col1 AND tbaa.num = 2) AS col22FROM table1 AS tbbbcol1    col21    col22A    1    2B    3    4
[解决办法]
SQL code
use Tempdbgo--> -->  if not object_id(N'Tempdb..#T') is null    drop table #TGoCreate table #T([col1] nvarchar(1),[col2] int)Insert #Tselect N'A',1 union allselect N'A',2 union allselect N'B',3 union allselect N'B',4GoDECLARE @i VARCHAR(4),@s NVARCHAR(1000)Select TOP 1 @s='',@i=COUNT(*) from #T GROUP BY [col1] ORDER BY COUNT(*)  DESC WHILE @i>0    SELECT @s=',[Col'+@i+']=max(case when Row='+@i+' then [col2] end)'+@s,@i=@i-1EXEC('SELECT [col1]'+@s+'FROM (SELECT *,Row=ROW_NUMBER()OVER(PARTITION BY [col1] ORDER BY [col1])FROM #T)t GROUP BY [col1]')/*A    1    2B    3    4*/
[解决办法]
我也想问一下,对于行转列的问题,我看到论坛的高手们都很少为采用 pivot 的方法?
为什么呢?
是因为只有 SQL2005 及以后版本支持吗?还是因为个人习惯,或者效率的问题呢?

pivot 也同时支持静态和动态的写法。
[解决办法]
探讨

我也想问一下,对于行转列的问题,我看到论坛的高手们都很少为采用 pivot 的方法?
为什么呢?
是因为只有 SQL2005 及以后版本支持吗?还是因为个人习惯,或者效率的问题呢?

pivot 也同时支持静态和动态的写法。

[解决办法]
探讨

我也想问一下,对于行转列的问题,我看到论坛的高手们都很少为采用 pivot 的方法?
为什么呢?
是因为只有 SQL2005 及以后版本支持吗?还是因为个人习惯,或者效率的问题呢?

pivot 也同时支持静态和动态的写法。

[解决办法]
SQL code
if not object_id(N'tb') is null    drop table tbGoCREATE TABLE tb(    col1 VARCHAR(10),    col2 INT)GOINSERT INTO tbSELECT 'A', 1 UNION allSELECT 'A', 2 UNION allSELECT 'B', 3 UNION allSELECT 'B', 4;-- 静态pivot方法select col1, [1] as col21, [2] as col22from (    select rn= row_number() over (partition by col1 order by col1) , *         from tb     ) tpivot(    max(col2) for rn    in([1], [2])) pt
[解决办法]
SQL code
-- 动态pivot方法declare @sql varchar(8000)select @sql = isnull(@sql + '],[' , '') + cast(rn as varchar(10)) from (    select rn= row_number() over (partition by col1 order by col1) , *         from tb     ) t group by rn;set @sql = '[' + @sql + ']';set @sql = '    select *    from (    select rn= row_number() over (partition by col1 order by col1) , *             from tb         ) t    pivot    (         max(col2) for rn        in (' + @sql + ')    ) as pvt';exec (@sql) 

热点排行