❶ sql行列轉換
--測試環境MSSQL2008
--先創建一個表值函數,負責字元串拆分
CreateFunction[dbo].[f_split1](@SourceSqlVarchar(8000),@StrSeprateVarchar(2))
Returns@tempTable(idIntIdentity(1,1),colVarchar(100))
As
begin
Declare@chasVarchar(100)
Set@SourceSql=@SourceSql+@StrSeprate
While(@SourceSql<>'')
Begin
Set@ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)
Insert@temp(col)Values(@ch)
Set@SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),'')
End
Return
End
go
--建表
createtable#table(namenvarchar(500),valuenvarchar(max))
--插入數據
insertinto#tablevalues('aaa','45,44,44,44,43,43,43,43,43,43')
insertinto#tablevalues('bbb','45,44,44,44,44,44,44,44,44,43')
insertinto#tablevalues('ccc','13,12,12,12,4')
--由於N不固定,下面就動態生成SQL
Declare@Iint
Declare@WVarchar(1000)=''
Declare@SVarchar(4000)=''
Declare@SqlVarchar(8000)=''
select@I=max(len(value)-len(replace(value,',','')))from#table
While@I>0
Begin
Set@W=',['+Convert(Varchar(10),@I)+']'+@W
Set@S=',['+Convert(Varchar(10),@I)+']AsTop'+Convert(Varchar(10),@I)+@S
Set@I=@I-1
End
Set@Sql='
selectname'+@S+'from#table
outerapplydbo.f_split1(value,'','')
pivot
(
max(col)
For
idin('+stuff(@W,1,1,'')+')
)p
orderbyname'
--執行
Exec(@sql)
❷ sql錶行到列的轉換
鑒於你已經新建好下面的表了 被我稱為tableB的表 前面的原始表稱為tableA 那就開始吧
truncate table tableB ---清空tableB的數據先
insert into tableB
(StuCJID,XXBH,語文, 數學, 英語 ,政治)
select StuCJID,XXBH,Score,0,0,0
from tableA where KeCheng='語文' ---把A裡面所有語文的記錄都插入到B
update a set a.數學=b.Score from tableB a left join tableA b on a.XXBH=b.XXBH
where b.KeCheng='數學' ---對應更新B的數學和A同一個XXBH的人一致
update a set a.英語=b.Score from tableB a left join tableA b on a.XXBH=b.XXBH
where b.KeCheng='英語' ---對應更新B的英語和A同一個XXBH的人一致
update a set a.政治=b.Score from tableB a left join tableA b on a.XXBH=b.XXBH
where b.KeCheng='政治'---對應更新B的政治和A同一個XXBH的人一致
select * from tableB order by XXBH ---查詢結果
❸ SQL 行列轉換
行列轉換等經典SQL語句
1.--行列轉換
原表: 姓名 科目 成績
張三 語文 80
張三 數學 90
張三 物理 85
李四 語文 85
李四 物理 82
李四 英語 90
李四 政治 70
王五 英語 90
轉換後的表: 姓名 數學 物理 英語 語文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
張三 90 85 0 80 0
實例:
create table cj --創建表cj
(
ID Int IDENTITY (1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定義ID為表cj的主鍵
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '張三','語文',80 union all
Select '張三','數學',90 union all
Select '張三','物理',85 union all
Select '李四','語文',85 union all
Select '李四','物理',82 union all
Select '李四','英語',90 union all
Select '李四','政治',70 union all
Select '王五','英語',90
--行列轉換
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名稱都列舉出來
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列轉換--合並
原表: 班級 學號
1 1
1 2
1 3
2 1
2 2
3 1
轉換後的表: 班級 學號
1 1,2,3
2 1,2
3 1
實例:
Create table ClassNo --創建表ClassNo
(
ID Int IDENTITY(1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
Class Varchar(50), --班級列
Number Varchar(50), --學號列
Primary Key(ID) --定義ID為表ClassNo的主鍵
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
創建一個合並的函數
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
--調用自定義函數得到結果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列轉行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定義ID為表ColumnToRow的主鍵
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的長度就是這個字元串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因為它會把ID這一列的值也算進去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')
❹ 急求:SQL語句進行行列轉換!!!
你的這種變化貌似是毫無意義的,或許
你想要的變換時下面的這種情況吧。
******原來的縱表tb*****
學號
科目
成績
1001
語文
90
1001
數學
80
1001
英語
70
1002
語文
95
1002
數學
85
1002
英語
75
*****目標的橫表*****
學號
語文
數學
英語
總分
1001
90
80
70
240
1002
95
85
75
255
sql語句:
select
學號
as
'學號',
sum(case
科目
when
'語文'
then
成績
else
0
end)
as
'語文',
sum(case
科目
when
'數學'
then
成績
else
0
end)
as
'數學',
sum(case
科目
when
'英語'
then
成績
else
0
end)
as
'英語',
sum(case
when
科目!=''
then
成績
end)
as
'總分'
from
tb
group
by
學號
❺ sql 行列轉換
我來說一下:
這個可以寫成一句普通的sql,你這寫的是動態sql,性能不如普通sql,並且欄位名「語文」、「數學」、「物理」,你還無法加上。
一句sql:select 姓名,『語文』=sum(case 課程 when 『語文』 then 分數 esle 0 end),『數學』=sum(case 課程 when 『數學』 then esle 0 分數 end),『物理』=sum(case 課程 when 『物理』 then esle 0 分數 end)from tb group by 姓名
這個其實和他們的差不多,你把這個理想了,你會覺得很簡單的,動態sql寫的挺復雜的,老實說,我都看不懂,我也懶得看。不理解的問我。
你記住這樣一句話:一列數據變成多列數據,用case語句;
一行數據變成多行數據,考慮自連接。
❻ SQL里行列轉換
sqlserver2005中可以用
Pivot UnPivot
來實現。
sqlserver2000的話,行數 和列數在資料庫中是可變的,恐怕很難實現。想想存儲過程+臨時表吧。
❼ 寫sql,怎麼將查詢結果的行列轉換呀
有意思的問題 給出一個參考的URL: 假設你表是這樣的結構部件 入庫日期 入庫數量 A 1/1 10 A 1/1 5 A 1/2 10 B 1/5 10 其實就是兩種方法,假設你的資料庫是11以前的,只能先定義好查哪天到哪天 然後那麼 selct 部件, sum( decode(入庫日期=1號,入庫數量,0), sum( decode(入庫日期=2號,入庫數量,0), 以此類推 from 入庫表 group BY 部件(原理上就是將不是這天的變成0,再合計)要是Oracle資料庫是11的話,就簡單了,直接pivot搞定 pivot語法就不說了,網上一堆一堆的 ~
❽ SQL 進行行列轉換
Select
A01出水溫度 = ISNULL((Select SetUpName From XXX Where SetupID = 1),0),
A02出水溫度 = ISNULL((Select SetUpName From XXX Where SetupID = 2),0),
A03出水溫度 = ISNULL((Select SetUpName From XXX Where SetupID = 3),0),
A04出水溫度 = ISNULL((Select SetUpName From XXX Where SetupID = 4),0),
.........
OK! 注意:沒有From語句
❾ SQL行列轉換
SQL2000:
use Tempdb
go
--> -->
if not object_id(N'A') is null
drop table A
Go
Create table A([ID] nvarchar(5),[Name] nvarchar(4),[Age] int,[Sex] nvarchar(10))
Insert A
select N'a01',N'張三',19,N'男' union all
select N'a02',N'李四',20,N'女' union all
select N'a03',N'王五',21,N'男'
Go
if not object_id(N'B') is null
drop table B
Go
Create table B([表名] nvarchar(20),[列名] nvarchar(20),[欄位長度] int,[欄位組合] nvarchar(10))
Insert B
select N'A',N'ID',5,N'組合' union all
select N'A',N'Name',4,N'中文' union all
select N'A',N'Age',3,N'數字' union all
select N'A',N'Sex',2,N'選擇'
Go
--表名='A'(也就是A表), A表的ID='a01'
declare @TableName sysname,@ID nvarchar(10)
select @TableName='A',@ID='a01'
declare @S1 nvarchar(4000)
select @S1=isnull(@S1+' union all ','')+'select [列名]='+quotename(Name,'''')
+',[列欄位]= cast('+quotename(Name)+' as nvarchar(10)) from ['+@TableName+'] where ID='''+@ID+''''
from syscolumns where ID=object_id(@TableName)
exec(
'select b.[列名], a.[列欄位],b.[欄位長度], b.[欄位組合] from ('+@S1+N')a inner join B on a.[列名]=b.[列名] where b.[表名]='''+@TableName+'''')
/*
列名 列欄位 欄位長度 欄位組合
ID a01 5 組合
Name 張三 4 中文
Age 19 3 數字
Sex 男 2 選擇
*/
❿ sql語句行轉列 怎麼轉啊
--聲明變數
declare@sqlvarchar(1000),@num_dataint,@num_allvarchar(2000),@num_numint,@table_sqlvarchar(2000)
set@num_num=0
--判斷並創建表
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[records]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[records]
createtablerecords(
[id]int,
[name]varchar(50),
[sex]varchar(10),
[num]int
)
--插入數據
insertintorecordsvalues(1,'tom','男',2)
insertintorecordsvalues(1,'tom','男',3)
insertintorecordsvalues(1,'tom','男',4)
insertintorecordsvalues(1,'tom','男',5)
--全選表中數據
select*fromrecords
--全選num列數據
selectnumas'數據'fromrecords
--釋放游標
deallocateselect_num
--為『selectnumfromrecords』建立游標
declareselect_numscrollcursorforselectnumas'shuju'fromrecords
--打開游標
openselect_num
--獲得第一條數據
fetchnextfromselect_numinto@num_data
set@num_all=convert(varchar,@num_data)+','
set@num_num=@num_num+1;
--如果獲取成功,繼續獲得數據
while@@fetch_status=0
begin
fetchnextfromselect_numinto@num_data
set@num_num=@num_num+1;
set@num_all=@num_all+convert(varchar,@num_data)+','
end
--關閉游標
closeselect_num
print@num_num
--set@num_num=@num_num-1;
declare@iint
set@i=1
print@num_num
print@i
set@table_sql='createtablenumall(idint,namevarchar(50),sexvarchar(10)'
print@table_sql
while@num_num>=1
begin
set@table_sql=@table_sql+',num'+convert(varchar,@i)+'int'
set@num_num=@num_num-1;
set@i=@i+1
end
set@table_sql=@table_sql+')'
print@table_sql
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[numall]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[numall]
exec(@table_sql)
declare@insert_sqlvarchar(2000)
set@insert_sql='insertintonumallvalues(1,'+'''tom'','+'''男'''
print@insert_sql
openselect_num
--獲得第一條數據
fetchnextfromselect_numinto@num_data
set@insert_sql=@insert_sql+','+convert(varchar,@num_data)
--如果獲取成功,繼續獲得數據
while@@fetch_status=0
begin
fetchnextfromselect_numinto@num_data
set@insert_sql=@insert_sql+','+convert(varchar,@num_data)
end
set@insert_sql=@insert_sql+')'
print@insert_sql
exec(@insert_sql)
--insertintonumallvalues(1,'tom','男',2,3,4,5,5)
select*fromnumall
試試吧,數據雖然有點出入,但已經說明問題了!!!