日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL SERVER中的纵横查询

發布時間:2025/3/17 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL SERVER中的纵横查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于sql的縱橫查詢,其實說白了就是pivot(行轉列)、unpivot(列轉行)、字符拼接、for xml path。 網上寫關于這方面的東西太少,大多都是把他們分開寫的,所以我給大家匯個總

給大家來幾個例子,應該能弄明白吧!
首先創建個表插幾條數據吧
<span style="font-size:14px;">create table dbo.test(id int ,name nvarchar(20) ,score int) insert into kktest.dbo.testselect 1 ,'張三' ,60unionselect 1 ,'李四' ,65unionselect 1 ,'王麻子' ,70unionselect 1 ,'大麻子' ,75</span>

select * from test id name score
1 ?大麻子 75
1 ?李四 ? ? 65
1 ?王麻子 70
1 ?張三 ? ? 60


pivot <span style="font-size:14px;">select * from dbo.test pivot (sum([score]) for [name]in([張三],[李四],[王麻子],[大麻子]) )as s</span>結果: id ?張三 ?李四 ?王麻子 ?大麻子
1 ?60 ? ? ?65 ? ? ?70 ? ? ? ? 75

這里簡單的說下這個函數吧,后面的別名還是一定要的,在pivot中的列一般養成個好習慣加[],對于 int類型的列來說,執行會報這列無效的錯誤,因為是行轉列,所以,除你做對象的列其他的列如果不能 聚合,那么查詢出來的列中沒有數據的地方會用null填充。


unpivot
首先來個錯誤的 <span style="font-size:14px;">SELECT * FROM dbo.test unpivot (值 for 列 in([id],[name],[score])) as s where name = '王麻子'</span>
結果:
列 "name" 的類型與 UNPIVOT 列表中指定的其他列的類型沖突

所以說要轉的類型必須是要是同類型!
再來個正確的別打臉
<span style="font-size:14px;">SELECT * FROM dbo.test unpivot (值 for 列 in([id],[score])) as s where name = '王麻子'</span>
結果:
name 值 列
王麻子 1 id
王麻子 70 score


這里只查一行就是為了圖個對比。。。

然后就是行拼接,差不多就是:"***"+"***"
國際慣例,先來個錯的: <span style="font-size:14px;">select id+name+score from dbo.test</span>
結果:
在將 nvarchar 值 '大麻子' 轉換成數據類型 int 時失敗。

新手應該能夠理解吧!

再來個:
<span style="font-size:14px;">select cast(id as nvarchar(50))+name+cast(score as nvarchar(50)) as 合并 from dbo.test</span>
結果:

合并
1大麻子75
1李四65
1王麻子70
1張三60

這里呢為什么要轉成nvarchar類型?因為字符拼接要轉成字符你打我我報警
不服來個int不轉字符直接拼:
<span style="font-size:14px;">select id+score from dbo.test</span>
結果: (無列名)
76
66
71
61

結果是相加的

for xml path
這里來兩種方式吧,結果都是為了把列拼起來
<span style="font-size:14px;">select stuff(( select ',' + ( isnull(name, '') )from test for xml path('') ),1,1,'') as xml拼</span>
結果:
xml拼
大麻子,李四,王麻子,張三

<span style="font-size:14px;">select id, name=stuff((select ','+name from kktest.dbo.test as b where a.id=b.id for xml path('')),1,1,'') from kktest.dbo.test as a group by a.id</span>
結果:
id name
1 大麻子,李四,王麻子,張三

這里就是把表轉成xml格式,至于為什么要用isnull就是如果有一行是null那么整個串都是null。

行列的玩法有很多種!大家自己摸索吧

總結

以上是生活随笔為你收集整理的SQL SERVER中的纵横查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。