sql 行列互轉

2022-07-22 13:33:11 字數 3191 閱讀 4805

1、行轉列

現有資料:

期望資料:

1.1建表建資料

if object_id('temp_20170701','u') is not null drop table temp_20170701

create table temp_20170701 (

id int primary key identity(1,1),

name nvarchar(50),

subjectname nvarchar(50),

score int

)insert dbo.temp_20170701( name, subjectname, score )

select 'a','語文','20' union

select 'a','數學','30' union

select 'a','英語','40' union

select 'b','語文','50' union

select 'b','數學','60' union

select 'b','英語','70' union

select 'c','語文','80' union

select 'c','數學','90' union

select 'c','英語','100' union

select 'd','英語','100'

1.2 .1 靜態實現

select name , max(case when subjectname='語文' then score else 0 end)語文 ,

max(case when subjectname='數學' then score else 0 end)數學,

max(case when subjectname='英語' then score else 0 end)英語

from dbo.temp_20170701 group by name

1.2.2 動態實現 

declare @sql varchar(500) 

set @sql='select name '

select @sql=@sql+',max(case subjectname when '''+subjectname+''' then score else 0 end)['+subjectname+']'

from(select distinct subjectname from temp_20170701)a

set @sql=@sql+' from temp_20170701 group by name'

--select @sql

exec(@sql)

2、行轉列 逗號隔開

現有資料如1的第一張圖

期望資料:

2.1、使用xml path

select name ,score=stuff((select ','+convert(nvarchar(max),score) from temp_20170701 t1 where t1.name=t2.name for xml path('')),1,1,'')

from temp_20170701 t2 group by t2.name

2.2、使用 函式

create function [dbo].[hconvertl]

(@groupid nvarchar(max)

)returns [nvarchar](max)

asbegin

declare @returnvalue [nvarchar](max)

set @returnvalue = ''

select @returnvalue=@returnvalue + rtrim(ltrim(score)) + ','

from temp_20170701

where name = @groupid

set @returnvalue = ','+@returnvalue --substring(@returnvalue,1,len(@returnvalue)-1)

return @returnvalue

endselect distinct name,dbo.[hconvertl](name) score from temp_20170701

3、列轉行

原始資料:

期望資料:

3.1建表建資料

if object_id('tempdb..#temp_20170701_02','u') is not null drop table #temp_20170701_02

create table #temp_20170701_02

(id int primary key identity(1,1),

name nvarchar(50),

語文 int not null default 0,

數學 int not null default 0,

英語 int not null default 0

)insert #temp_20170701_02( name, 語文, 數學, 英語 )

select 'a',20,30,40 union

select 'b',50,60,70 union

select 'c',80,90,100 union

select 'd',100,0,0

3.2 使用unpivot實現

select  name ,

subjectname ,

score

from #temp_20170701_02 unpivot ( score for subjectname in ( 語文, 數學, 英語 ) ) #temp_20170701_02

hive行列互轉

先說行轉列是什麼意思啊,假設有這樣的資料,uid表示使用者,time表示時刻,event表示使用者這個時刻在幹什麼,我們儲存到資料庫中就是這樣的 uidtime event a09 01 00睜眼a 09 02 00 找手機a 09 03 00發呆a 09 04 00洗臉a 09 05 00刷牙a ...

行列互轉之case when

檢視資料結構 select from emp select ename,sal,deptno from emp 行轉列,case when和max 函式 select ename,max case deptno when 10 then sal end d10,max case deptno whe...

oracle之行列互轉

建立臨時表 temp with tempas select 湖北省 nation,武漢市 city,first rank from dual union allselect 湖北省 nation,宜昌市 city,second rank from dual union allselect 湖北省 n...