SQL SERVER中的纵横查询
生活随笔
收集整理的這篇文章主要介紹了
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。
行列的玩法有很多種!大家自己摸索吧
給大家來幾個例子,應該能弄明白吧!
首先創建個表插幾條數據吧
<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中的纵横查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows系统下nodejs安装及配
- 下一篇: Errors running build