1. 程式人生 > >SQL SERVER透視轉換(行旋轉列)

SQL SERVER透視轉換(行旋轉列)

所謂的透視轉化通俗點就是吧資料庫的行轉成列的一種處理方式,透視轉換是一種常用的技巧,在生活中人們更喜歡看經過透視轉化的資料表,這種表更加直觀和簡潔,下面將介紹兩種處理方式。

樣例資料:

USE tempdb;

IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL DROP TABLE dbo.Orders;
GO

CREATE TABLE dbo.Orders
(
  orderid   INT        NOT NULL,
  orderdate DATE       NOT NULL, -- prior to SQL Server 2008 use DATETIME
  empid     INT        NOT NULL,
  custid    VARCHAR(5) NOT NULL,
  qty       INT        NOT NULL,
  CONSTRAINT PK_Orders PRIMARY KEY(orderid)
);

INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
VALUES
  (30001, '20070802', 3, 'A', 10),
  (10001, '20071224', 2, 'A', 12),
  (10005, '20071224', 1, 'B', 20),
  (40001, '20080109', 2, 'A', 40),
  (10006, '20080118', 1, 'C', 14),
  (20001, '20080212', 2, 'B', 12),
  (40005, '20090212', 3, 'A', 10),
  (20002, '20090216', 1, 'C', 20),
  (30003, '20090418', 2, 'B', 15),
  (30004, '20070418', 3, 'C', 22),
  (30007, '20090907', 3, 'D', 30);

注意:如果SQL SERVER 是2008一下的資料不能採用這個格式插入。這是2008新增的語法。
本篇部落格,來自個人對MicroSoft SQL Server 2008技術內幕:T-SQL語言基礎第七章總結,有有興趣的朋友可以去原文;

在進一步解釋透光轉化是什麼的時候,先考慮一個需求:生成一個報表,包含每個僱員和客戶組合之間總訂貨量,下面的查詢就可以解決這個需求了。

SELECT empid, custid, SUM(qty) AS sumqty
FROM dbo.Orders
GROUP BY empid, custid;

查詢結果:


現在這個結果每一行表示,具體的僱員+具體的客戶 ,他們之間的總訂貨量。如果我想讓這個表格形成一個更加直觀的,我們更能接受的二維表方式,比如每個僱員按行,客戶按列展示資料(透視檢視)
效果如下:

透視轉換將要涉及三個邏輯處理階段:
1.分組階段:處理相關的分組或者行元素
i.這階段判斷以什麼分組(empid),確定什麼為行(empid)
2.擴充套件階段:處理相關的擴充套件或列元素
i.判斷以什麼作為列(custid的列值[A,B,C,D])
3.聚合階段:處理相關的聚合元素和聚合函式
i.要聚合那個列,用什麼聚合函式
下面介紹第一種處理方式:
1.使用標準SQL進行透光轉換
從透光檢視分析,empid只用單個值,可以看出這裡是以empid進行分組,取表中的一行進行分析

這一行經過轉換後可以理解為在在,行=2,列=A 處取兩者的SUM(qty)所以查詢語句這麼寫:

SELECT empid,
  SUM(CASE WHEN custid = 'A' THEN qty END) AS A,
  SUM(CASE WHEN custid = 'B' THEN qty END) AS B,
  SUM(CASE WHEN custid = 'C' THEN qty END) AS C,
  SUM(CASE WHEN custid = 'D' THEN qty END) AS D  
FROM dbo.Orders
GROUP BY empid

就可以得到我們想要的結果了

這個查詢語句思維這麼理解:按empid(做行)分組,當前empid在A列中只有當custid = ‘A’才返回具體的qty值,否則返回為空,再把當前行且custid = ‘A’的qty值聚合起來,其他列也一樣。

2.使用T-SQL PIVOT運算子進行透視轉化
i.pivot 用法解釋
a)<源表或者表表達式>  pivot (聚合函式(要聚合的列) for <要旋轉為行的列>  in (目標列)) as 目標表名
b)細心的朋友也發現的pivot的用法中沒有出現要分組的列,這是因為pivot對它的輸入表進行了隱式分組,把輸入表中的除了聚合列(qty),拓展列(custid)之外的所有列都當成分組元素。所以這邊建議大家使用pivot 的時候儘量使用表表達式來作為輸入表。避免當源表修改的時候透視轉化受影響

像填空一樣把值填進去之後,pivot查詢語句為:

SELECT empid, A, B, C, D
FROM (SELECT empid, custid, qty
      FROM dbo.Orders) AS D
  PIVOT(SUM(qty) FOR custid IN(A, B, C, D)) AS P;

查詢結果和另一種方式一樣

相關推薦

SQL SERVER透視轉換旋轉

所謂的透視轉化通俗點就是吧資料庫的行轉成列的一種處理方式,透視轉換是一種常用的技巧,在生活中人們更喜歡看經過透視轉化的資料表,這種表更加直觀和簡潔,下面將介紹兩種處理方式。 樣例資料: USE tempdb; IF OBJECT_ID('dbo.Orders', 'U')

sql pivot 和unpivot轉行的用法

sql clas 數據 sele core unp null col style 1、PIVOT用法(行轉列) select * from Table_Score as a pivot (sum(score) for a.name in ([語文],[數學],[外語],[

SQL pivot,unpivot轉行

【pivot】行轉列:多行變一列 假設學生成績表Score1 Name Subject Score 小張 語文 88 小花 數學 89 小張

SQL 統計 欄位 豎向轉橫向 顯示

在做一些SQL統計時,為了更直觀看到結果,並進行比較,需要把豎向表的部分統計欄位轉成橫向顯示。 原資料格式: wbname        newstime ------------------------------ 瀟湘晨報        直播報道 佛山日報後天 揚子晚

經常用到的透視函式&轉行函式 PIVOT()&UNPIVOT

 說明: 工作中經常遇到一組or一條資料按照不同型別被分成多條資料,如 一條合同的分期還款賬單按照不同型別被分成本金,利息,管理費等, 資料統計工作中,一條合同一期就會分成多條合同 如 實際工作中 常需要將同一期多條資料整合成一期並且賬單條目型別橫向顯示,即資料透視過程:

"System.OutOfMemoryException" exception when you execute a query in SQL Server Management Studio 轉自MSDN

Symptoms When you use Microsoft SQL Server Management Studio (SSMS) to run an SQL query that returns a large amount of data, you receive an error messag

SQL Server資料庫開發6.儲存過程

一、儲存過程(procedure) 1.定義:用來執行管理業務或應用複雜的業務規則 儲存過程可以帶引數,也可以返回結果。 2.儲存過程可以包含資料操縱語句、變數、邏輯控制語句 3.儲存過程的優點: 3.1允許模組化程式設計 一次建立多次使用,並可獨立於原始碼而單獨

SQL Server資料庫開發1.資料庫設計

一、E-R圖   實體:可以用我們已知的“物件”去理解,若干個具有共同特性的的實體稱為”實體集”。符號:矩形。   屬性:它是一個數據,它的表現為某個實體的一個特徵,實體包含其作為“成員資料”。符號:橢圓形。   關係:實體有大有小,某些實體的存在是建立在另

SQL server Configuration Manager 配置管理器 analysis service 處於 ‘正在掛起更改’ 狀態

SQL server Configuration Manager (配置管理器) analysis service 處於  ‘正在掛起更改’ 狀態 SQL server  manager  studio無法連線到伺服器 原因: analysis  服務原始檔損壞,拷貝新

如何使 SQL Server高效 -- 程式設計ITPUT 討論彙總

3、     在設計資料庫操作程式上,您認為應該注意哪些事項,以確保能夠有效地使用資料庫? 討論彙總l  儘量縮小讀寫操作範圍和可重複性, 可採用臨時表或表變數等中間過程過渡l  快取。在程式端快取常用資料l  )靜態化。對應較穩定的資料,可以將它靜態化存放,避免資料庫訪問l

SQL server基礎之表間關聯

首先先準備一些資料 --E-R圖 --學生(學號,姓名,性別,生日,班級,密碼) --課程(編號,課程) --分數(學號,編號,分數) (學生表:Student) (課程表:KC) (分數表:Coure) 很簡單的三個表。。接著我們來用幾種常見的連線方法把三張表連線在

Sql Server 的crud增刪改查以及一些簡單的巢狀查詢

列出一些簡單的查詢語句,做一下筆記! Ps:使用sql語句最好統一大小寫 1:建立和刪除資料庫 create database dbname //建立資料庫 drop database dbname //刪除資料庫 2:建立表 use db

解決SQL Server error:40錯誤:53

在建立與伺服器的連線時出錯。在連線到SQL Server 2005時,在預設的設定下SQL Server不允許進行遠端連線可能會導致此失敗。(provider:命名管道提供程式,error:40-無法開啟到SQL Server的連線)(Microsoft SQL Serv

在與 SQL Server 建立連線或者遠端連線出現與網路相關的或特定於例項的錯誤。Microsoft SQL Server,錯誤: 10061

登陸sqlserver2008時候用主機名登陸時候報這個錯誤 或者遠端登陸 “ ” 解決方法: 1:開啟sqlserver配置管理器 2:找到Sql server 網路配置管理器 ,MSSQLSE

Sql server基本語句增刪改查

1增 1.1【插入單行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性別,出生日期) values ('

老生常談之SQL Server 轉行

1 --靜態的行轉列 2 --新建一個科目成績表 3 --三個欄位:學生名稱,科目,成績 4 CREATE TABLE SubjectScore 5 ( 6 StuName nvarchar(20), 7 SubjectName nvarchar(20), 8 F

MySQL 行列轉換變化各種方法實現總結報表統計 資料記錄統計等

                前言:mysql行列變化,最難的就是將多個列變成多行,使用的比較多的是統計學中行變列,列變行,沒有找到現成的函式或者語句,所以自己寫了儲存過程,使用動態sql來實現,應用業務場景,使用者每個月都有使用記錄數錄入一張表,一個月一個欄位,所以表的欄位是動態增長的,現在需要實時統計當

[MySQL] 行列轉換變化各種方法實現總結報表統計、資料記錄統計等

前言:mysql行列變化,最難的就是將多個列變成多行,使用的比較多的是統計學中行變列,列變行,沒有找到現成的函式或者語句,所以自己寫了儲存過程,使用動態sql來實現,應用業務場景,使用者每個月都有使用記錄數錄入一張表,一個月一個欄位,所以表的欄位是動態增長的,現在需要實時統計

sql Server超過了每的最大位元組數8060的原因和解決辦法

一、現象     出現這種錯誤都發生在SQL語句建表時,錯誤提示:     "警告: 已建立表 'XXXX,但其最大行大小(10438)超過了每行的最大位元組數(8060)。如果結果行長度超過 8060 位元組,則此表中行的 INSERT 或 UPDATE 將失敗。"

[MySQL] 行列轉換變化各種方法實現總結報表統計、資料記錄統計等

前言: mysql行列變化,最難的就是將多個列變成多行,使用的比較多的是統計學中行變列,列變行,沒有找到現成的函式或者語句,所以自己寫了儲存過程,使用動態sql來實現,應用業務場景,使用者每個月都有使用記錄數錄入一張表,一個月一個欄位,所以表的欄位是動態增長的,