行转列问题求助
行转列问题求助
数据如下
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 也同时支持静态和动态的写法。
[解决办法]
[解决办法]
[解决办法]
- 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)