程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL中行轉列和列轉行

SQL中行轉列和列轉行

編輯:關於SqlServer

行轉列,列轉行是我們在開發過程中經常碰到的問題。行轉列一般通過CASE WHEN 語句來實現,也可以通過 SQL SERVER 2005 新增的運算符PIVOT來實現。用傳統的方法,比較好理解。層次清晰,而且比較習慣。 但是PIVOT 、UNPIVOT提供的語法比一系列復雜的SELECT...CASE 語句中所指定的語法更簡單、更具可讀性。下面我們通過幾個簡單的例子來介紹一下列轉行、行轉列問題。

我們首先先通過一個老生常談的例子,學生成績表(下面簡化了些)來形象了解下行轉列

CREATE  TABLE [StudentScores]
   
(
   
   [UserName]         NVARCHAR(20),        --學生姓名
   
    [Subject]          NVARCHAR(30),        --科目
   
    [Score]            FLOAT,               --成績
   
)
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '語文', 80
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '數學', 90
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '英語', 70
   
    
   
INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '語文', 80
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '數學', 90
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '英語', 70
   
    
   
INSERT INTO [StudentScores] SELECT 'Kent', '生物', 85

如果我想知道每位學生的每科成績,而且每個學生的全部成績排成一行,這樣方便我查看、統計,導出數據

SELECT
   
      UserName, 
   
      MAX(CASE Subject WHEN '語文' THEN Score ELSE 0 END) AS '語文',
   
      MAX(CASE Subject WHEN '數學' THEN Score ELSE 0 END) AS '數學',
   
      MAX(CASE Subject WHEN '英語' THEN Score ELSE 0 END) AS '英語',
   
      MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'
   
FROM dbo.[StudentScores]
   
GROUP BY UserName
查詢結果如圖所示,這樣我們就能很清楚的了解每位學生所有的成績了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved