亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

發布時間:2022-01-24 13:38:22 來源:億速云 閱讀:142 作者:iii 欄目:開發技術

這篇“SQL Server中怎么使用Pivot和UnPivot實現行列轉換”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“SQL Server中怎么使用Pivot和UnPivot實現行列轉換”文章吧。

先創建一個用于演示的臨時表:

create table #temp
(
    年份    nvarchar(10)    null,
    月份    nvarchar(10)    null,
    數量    int        null
)
insert into #temp(年份,月份,數量)
select '2015','1','5645' union
select '2015','2','1234' union
select '2015','3','7982' union
select '2016','1','6465' union 
select '2016','2','7942' union
select '2016','3','8453' union
select '2017','1','4653' union
select '2017','2','1358' union
select '2017','3','7842' 
select * from #temp

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

下面來實現一些需求:

需求一,按年份分組,不同的月份為一列。

-- 按年份分組,不同的月份為一列
select t.年份,
sum(case t.月份 when '1' then t.數量 end) '1月份',
sum(case t.月份 when '2' then t.數量 end) '2月份',
sum(case t.月份 when '3' then t.數量 end) '3月份'
from #temp t
group by t.年份

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

另外兩種方法:

-- 使用左外連接查詢
select t.年份,t1.數量 '1月份',t2.數量 '2月份',t3.數量 '3月份' from #temp t
left join (select 年份,數量 from #temp where 月份='1') t1 on t.年份=t1.年份
left join (select 年份,數量 from #temp where 月份='2') t2 on t.年份=t2.年份
left join (select 年份,數量 from #temp where 月份='3') t3 on t.年份=t3.年份
group by t.年份,t1.數量,t2.數量,t3.數量

-- 使用自連接查詢
select t.年份,t1.數量 '1月份',t2.數量 '2月份',t3.數量 '3月份' 
from #temp t,
(select 年份,數量 from #temp where 月份='1') t1,
(select 年份,數量 from #temp where 月份='2') t2,
(select 年份,數量 from #temp where 月份='3') t3
where t.年份=t1.年份 and t.年份=t2.年份 and t.年份=t3.年份
group by t.年份,t1.數量,t2.數量,t3.數量

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

返回的結果都是一樣的,可以看見這幾種方法都是可以實現的(當然,可能還有更多的方法待發掘),不過比起第一種方法,后面這兩種方法也太低效了吧,比如一年有12個月份的數據,有個七八年的,那得寫多少個子查詢、表連接的,而且第一種方法也不是我們想要的。那么就需要用到 Pivot 這種方法了。

Pivot 語法:

table_source    -- 表名稱,即數據源

    PIVOT(

    聚合函數(value_column)    -- value_column 要轉換為 列值 的列名

    FOR pivot_column        -- pivot_column 指定要轉換的列

    IN(<column_list>)        -- column_list 自定義的目標列名
)

因為這里列名不允許指定為數字,真是無語。。。我重建了一個數據結構一模一樣的表。

create table #temp
(
    Name    nvarchar(10)    null,
    Course    nvarchar(10)    null,
    Score    int        null
)
insert into #temp(Name,Course,Score)
select '小李','語文','88' union
select '小李','數學','79' union
select '小李','英語','85' union
select '小明','語文','79' union 
select '小明','數學','89' union
select '小明','英語','87' union
select '小紅','語文','84' union
select '小紅','數學','76' union
select '小紅','英語','92' 
select * from #temp
go

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

select Name 姓名,
max(case Course when '語文' then Score end) 語文,
max(case Course when '數學' then Score end) 數學,
max(case Course when '英語' then Score end) 英語,
sum(Score) 課程總分,
cast(avg(Score) as decimal(18,2)) 課程平均分
from #temp
group by Name

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

使用 Pivot 進行 行轉列:

select a.Name 姓名,a.語文,a.數學,a.英語
from #temp 
pivot
(
    max(Score)    -- 指定作為轉換的列的值 的列名
    for Course        -- 指定要轉換的列的列名
    in(語文,數學,英語)    -- 自定義的目標列名,即要轉換列的不同的值作為列
)

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

select a.Name 姓名,a.語文,a.數學,a.英語,b.SumScore 課程總分,b.AvgScore 課程平均分
from #temp 
pivot
(
    max(Score)    -- 指定作為轉換的列的值 的列名
    for Course        -- 指定要轉換的列的列名
    in(語文,數學,英語)    -- 自定義的目標列名,即要轉換列的不同的值作為列
)a,
(
    select t.Name,sum(t.Score) SumScore,cast(avg(t.Score) as decimal(18,2)) AvgScore
    from #temp t
    group by t.Name
)b
where a.Name=b.Name

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

UnPivot 語法:

table_source    -- 表名稱,即數據源
    UNPIVOT(
    value_column    -- value_column 要轉換為 行值 的列名
    FOR pivot_column    -- pivot_column 指定要轉換為指定的列
    IN(<column_list>)    -- column_list 目標列名
)
create table #temp
(
    Name    nvarchar(10)    null,
    Chinese    int    null,
    Math    int    null,
    English int null
)
insert into #temp(Name,Chinese,Math,English)
select '小李','88','79','85' union
select '小明','79','89','87' union
select '小紅','84','76','92' 
select * from #temp
go

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

select t.Name 姓名,t.Course 課程,t.Score 分數 from
(select t.Name,Course='Chinese',Score=Chinese from #temp t
union all
select t.Name,Course='Math',Score=Math from #temp t
union all
select t.Name,Course='English',Score=English from #temp t) t
order by t.Name,t.Course
select t.Name 姓名,t.Course 課程,t.Score 分數 from
(select t.Name,'Chinese' Course,Chinese Score from #temp t
union all
select t.Name,'Math',Math from #temp t
union all
select t.Name,'English',English from #temp t) t
order by t.Name,t.Course

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

使用 UnPivot 進行 列轉行:

select t.Name 姓名,t.Course 課程,t.Score 分數 
from #temp 
unpivot 
(
    Score for Course
    in(Chinese,Math,English)
)

SQL?Server中怎么使用Pivot和UnPivot實現行列轉換

以上就是關于“SQL Server中怎么使用Pivot和UnPivot實現行列轉換”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉林省| 岑巩县| 连州市| 肃南| 子长县| 甘南县| 安泽县| 荣昌县| 巴东县| 清河县| 开阳县| 通辽市| 洛隆县| 鄂尔多斯市| 南澳县| 盈江县| 高阳县| 应用必备| 湖南省| 馆陶县| 苏尼特右旗| 罗田县| 从化市| 阳谷县| 通城县| 葫芦岛市| 台东县| 古田县| 白城市| 广昌县| 梅河口市| 张家口市| 张家港市| 乌海市| 阳高县| 札达县| 东宁县| 巴彦淖尔市| 奉节县| 房山区| 晋江市|