SQL Server資料庫基礎之行資料轉換為列資料

佚名發表於2019-09-03

文章主要給大家介紹了關於SQL Server基礎之行資料轉換為列資料的相關資料,文中透過示例程式碼介紹的非常詳細,對大家學習或者使用SQL Server具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

準備工作

建立表

use [test1]
go
 
create table [dbo].[student](
  [id] [int] identity(1,1) not null,
  [name] [nvarchar](50) null,
  [project] [nvarchar](50) null,
  [score] [int] null,
 constraint [pk_student] primary key clustered 
(
  [id] asc
)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [primary]
) on [primary]
go

插入資料

insert into test1.dbo.student(name,project,score)
values('張三','android','60'),
   ('張三','iOS','70'),
   ('張三','html5','55'),
   ('張三','.net','100'),
   ('李四','android','60'),
   ('李四','ios','75'),
   ('李四','html5','90'),
   ('李四','.net','100');

使用Case When和聚合函式進行行專列

語法

select column_name,
<aggregation function>(<case when expression>) 
from database.schema.table
group by column_name

語法解析

column_name

資料列列名

aggregation function

聚合函式,常見的有:sum,max,min,avg,count等。

case when expression

case when表示式

示例

select name,
max(case project when 'android' then score end) as '安卓',
max(case project when 'ios' then score end) as '蘋果',
max(case project when 'html5' then score end) as 'html5',
max(case project when '.net' then score end) as '.net'
from [test1].[dbo].[student]
group by name

示例結果

轉換前

轉換後

使用PIVOT進行行專列

PIVOT透過將表示式中一列中的唯一值轉換為輸出中的多個列來旋轉表值表示式。並PIVOT在最終輸出中需要的任何剩餘列值上執行聚合,PIVOT提供比一系列複雜的SELECT...CASE語句指定的語法更為簡單和可讀的語法,PIVOT執行聚合並將可能的多行合併到輸出中的單個行中。

語法

select <non-pivoted column>, 
  [first pivoted column] as <column name>, 
  [second pivoted column] as <column name>, 
  ... 
  [last pivoted column] as <column name> 
from
  (<select query that produces the data>)  
  as <alias for the source query> 
pivot 
( 
  <aggregation function>(<column being aggregated>) 
for 
[<column that contains the values that will become column headers>]  
  in ( [first pivoted column], [second pivoted column], 
  ... [last pivoted column]) 
) as <alias for the pivot table> 
<optional order by clause>;

語法解析

<non-pivoted column>

非聚合列。

[first pivoted column]

第一列列名。

[second pivoted column]

第二列列名。

[last pivoted column]

最後一列列名。

<select query that produces the data>

資料子表。

<alias for the source query>

表別名。

<aggregation function>

聚合函式。

<column being aggregated>

聚合函式列,用於輸出值列,最終輸出中返回的列(稱為分組列)將對其進行分組。

[<column that contains the values that will become column headers>]

轉換列,此列返回的唯一值將成為最終結果集中的欄位。

[first pivoted column], [second pivoted column], ... [last pivoted column]

資料行中每一行行要轉換的列名。

<optional order by clause>

排序規則。

示例

select b.Name,b.[android],b.[ios],b.[html5],b.[.net] 
from
(select Name,Project,Score from [test1].[dbo].[student])
as a
pivot
(
  max(Score)
  for Project in ([android],[ios],[html5],[.net])
) 
as b
order by b.name desc

示例結果

轉換前

轉換後

注意事項

1、如果輸出列名不能在錶轉換列中,則不會執行任何計算。

2、輸出的所有列的列名的資料型別必須一致。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值。

相關文章