1、行轉列
現有資料:
期望資料:
1.1建表建資料
if object_id('temp_20170701','u') is not null drop table temp_201707011.2 .1 靜態實現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'
select name , max(case when subjectname='語文' then score else 0 end)語文 ,1.2.2 動態實現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
declare @sql varchar(500)2、行轉列 逗號隔開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)
現有資料如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,'')2.2、使用 函式from temp_20170701 t2 group by t2.name
create function [dbo].[hconvertl]3、列轉行(@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.1建表建資料
if object_id('tempdb..#temp_20170701_02','u') is not null drop table #temp_20170701_023.2 使用unpivot實現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
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...