當前位置:首頁 » 編程語言 » sql行例轉換教程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql行例轉換教程

發布時間: 2023-02-23 06:00:00

1. 死磕:sql行轉列匯總(全網最全最詳細)

閱讀目錄

PIVOT 用於將列值旋轉為列名(即行轉列),在 SQL Server 2000可以用聚合函數配合CASE語句實現

PIVOT 的一般語法是:PIVOT(聚合函數(列) FOR 列 in (…) )AS P

注意:PIVOT、UNPIVOT是SQL Server 2005 的語法,使用需修改資料庫兼容級別(在資料庫屬性->選項->兼容級別改為 90 )

SQL2008 中可以直接使用

完整語法:

View Code

UNPIVOT 用於將列明轉為列值(即列轉行),在SQL Server 2000可以用UNION來實現

姓名 課程 分數

---------- ---------- -----------

張三 語文 74

張三 數學 83

張三 物理 93

李四 語文 74

李四 數學 84

李四 物理 94

姓名 語文 數學 物理

---------- ----------- ----------- -----------

李四 74 84 94

張三 74 83 93

姓名 語文 數學 物理 總分 平均分

---------- ----------- ----------- ----------- -----------

李四 74 84 94 252 84.00

張三 74 83 93 250 83.33

姓名 語文 數學 物理

---------- ----------- ----------- -----------

張三 74 83 93

李四 74 84 94

姓名 課程 分數

---------- ---- -----------

李四 語文 74

李四 數學 84

李四 物理 94

張三 語文 74

張三 數學 83

張三 物理 93

最後給大家分享Spring系列的學習筆記和面試題,包含spring面試題、spring cloud面試題、spring boot面試題、spring教程筆記、spring boot教程筆記、最新阿里巴巴開發手冊(63頁PDF總結)、2022年Java面試手冊。一共整理了1184頁PDF文檔。私信博主(777)領取,祝大家更上一層樓!!!

原文作者:王思明

原文出處:http://www.cnblogs.com/maanshancss/

2. sql語句列轉行

我整理的行轉列的問題:

--創建tb表
createtabletb(姓名varchar(10),課程varchar(10),分數int)
insertintotbvalues('張三','語文',74)
insertintotbvalues('張三','數學',83)
insertintotbvalues('張三','物理',93)
insertintotbvalues('李四','語文',74)
insertintotbvalues('李四','數學',84)
insertintotbvalues('李四','物理',94)
go

select*Fromtb

--SQLSERVER2000靜態行轉列
select姓名as姓名,
max(case課程when'語文'then分數elsenullend)語文,
max(case課程when'數學'then分數elsenullend)數學,
max(case課程when'物理'then分數elsenullend)物理
fromtb
groupby姓名

--SQLSERVER2000動態SQL,指課程不止語文、數學、物理這三門課程。(以下同)
declare@sqlvarchar(8000)
set@sql='select姓名'
select@sql=@sql+',max(case課程when'''+課程+'''then分數else0end)['+課程+']'
from(selectdistinct課程fromtb)asa
set@sql=@sql+'fromtbgroupby姓名'
exec(@sql)

--SQLSERVER2005靜態SQL。
select*from(select*fromtb)apivot(max(分數)for課程in(語文,數學,物理))b

--SQLSERVER2005動態SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+'],[','')+課程fromtbgroupby課程
set@sql='['+@sql+']'
exec('select*from(select*fromtb)apivot(max(分數)for課程in('+@sql+'))b')

希望對你的學習有幫助。

3. 寫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語法就不說了,網上一堆一堆的 ~

4. SQL 行列轉換

前段時間有人問了一個問題,就是SQL的行列轉換,當時有點懵沒答上來,後來細細想一想,其實最近的一個項目就已經用到了。
基礎數據如下:

要求根據當年的月份去統計出每一個ID的匯總金額。就是把行中的月切換到列中。
最後效果如下:

參考資料: https://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx#%E5%A4%8D%E6%9D%82%20PIVOT%20%E7%A4%BA%E4%BE%8B

帶批註的 PIVOT 語法。

如果聚合函數與 PIVOT 一起使用,則計算聚合時將不考慮出現在值列中的任何空值。

新建兩張表

查詢結果

--UNPIVOT 函數

--單純用SQL 處理 ,原理很簡單,就是對每個需要置換的列單獨處理出來

最終效果:

--用上面的結果新建表

--PIVOT

-- SQL直接處理,先用CASE 語句將每行處理出來,然後在用聚合去處理合並相同ID的行。

5. 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

試試吧,數據雖然有點出入,但已經說明問題了!!!

6. sql行列轉換

--mssql:
withtmp(col)as
(select'1111'unionall
select'2222'unionall
select'3333'unionall
select'4444'),
tmp1(col,col_new,level)as
(selectcol,cast(SUBSTRING(col,1,1)asnvarchar(10)),1
fromtmp
unionall
selectcol,cast(SUBSTRING(col,level+1,1)asnvarchar(10)),level+1
fromtmp1
wherelevel<LEN(col))
select(selectcol_new+''
fromtmp1
wherelevel=t.level
orderbycol_new
forxmlpath(''))ascol
fromtmp1t
groupbylevel;
--oracle:
withtmp(col)as
(select1111*levelfromalconnectbylevel<=4)
selectlistagg(a)withingroup(orderbya)ascol
from(selectcol,substr(col,column_value,1)a,column_valueb
fromtmp,
table(cast(multiset(selectlevel
fromal
connectbylevel<=length(col))as
sys.odcinumberlist)))
groupbyb

7. sql 如何實現行列轉換如圖

selectfangabh,listagg(ifbsh,'/')withingroup(orderbyfangabhdesc)
fromtable
groupbyfangabh

如果是oracle的話,也可以wmsys.wm_concat,如下
selectfangabh,wmsys.wm_concat(ifbsh)ifbsh,count(ifbsh)asttfromtable
groupbyfangabh
orderbyttdesc

8. 怎樣實現sql行轉列

--試一試。。。

createtable#test
(
姓名nvarchar(10),
學號nvarchar(10),
題號nvarchar(10),
答案nvarchar(10)
)
go
insertinto#test
select'張三','001','1','A'unionall
select'張三','001','2','C'unionall
select'李四','002','1','B'unionall
select'李四','002','2','D'

select*from#test

dECLARE@sqlVARCHAR(max)
SET@sql=''
SELECT@sql=@sql+',['+題號+']'FROM#testGROUPBY題號
SET@sql=STUFF(@sql,1,1,'')
SET@sql='select*from#testpivot(max(答案)for題號in('+@sql+'))a'
PRINT@sql
exec(@sql)

9. SQL 行轉列

我這里兩種都給你介紹,行轉列和列轉行:

列轉行——

錄入經營范圍時候會遇到列傳行的問題解決方案如下:

在temp1 表有一下欄位內容:

10. 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語句;
一行數據變成多行數據,考慮自連接。