1. 程式人生 > >SQL學習(一)--資料庫 行列轉換

SQL學習(一)--資料庫 行列轉換

SQLServer

1、UNPIVOT 操作符

UNPIVOT操作符就是取得一個行的資料集合,然後把每一行都轉換成多個行資料。

UNPIVOT 語法

下面就是 UNPIVOT 的語法:

SELECT [columns not unpivoted],
	 [unpivot_column],
       [value_column],
FROM
(<source query>)
AS <alias for the source data>
UNPIVOT ( [value_column] FOR [unpivot_column] IN ( <column_list> ) ) 
   AS <alias for unpivot>

Where:

    • [columns not unpivoted]: 不被轉換的列的名字清單。
    • [unpivot_column]: 不轉換的列的名稱。
    • [value_column]: 確定一個列名稱來代表不轉換的列的資料。
    • <source query>: 源資料。
  •       <alias for the source data>: 為源資料轉換後的表確定一個別名。
  •       <column_list>:  被轉換的列的列名稱。
  •      <alias for unpivot>: 為轉換操作的整套生產,確定一個別名。

為了更好地理解我們看下面的例子:

簡單的例子

USE tempdb;
GO
IF object_id('PhoneNumbers') IS NOT NULL DROP TABLE PhoneNumbers;
GO
CREATE TABLE PhoneNumbers (
	PersonID int, 
	HomePhone varchar(12),
	CellPhone varchar(12), 
	Workphone varchar(12), 
	FaxNumber varchar(12));

INSERT INTO PhoneNumbers VALUES 
	(1,Null,'444-555-2931',Null,Null),
	(2,'444-555-1950','444-555-2931',Null, Null),
	(3,'444-555-1950', Null,'444-555-1324','444-555-2310'),
	(4,'444-555-1950','444-555-2931','444-555-1324',
        '444-555-1987');
SELECT PersonID, PhoneType, PhoneNumber
FROM (
	SELECT PersonID, HomePhone, CellPhone, Workphone, FaxNumber
	FROM PhoneNumbers ) AS Src
	UNPIVOT (
		PhoneNumber FOR PhoneType IN 
		(HomePhone, CellPhone, WorkPhone, FaxNumber)) AS UNPVT;
unpivot

使用兩個UNPIVOT操作符

第二個例子中,我將使用兩個操作符來行轉列來轉換一套名字/值 的兩列資料。具體如下:

在表 CustPref裡面 我有四對名稱和值。

我們將使用不同的UNPIVOT操作符來建立一個結果集,每一個PrefType的名字和值針對每個CustID 和CustName。並聯使用操作符的作用是為了轉換兩組列。這樣講能表示為一個引數名稱和值在一行裡面。執行程式碼如下:

通過這個輸出結果,能發現不同的type對應不同的值得列,並且要關聯CustID。整個查詢通過兩個不同的UNPOVOT操作符同時使用了where 子句來合併輸出結果(基於列名前五個字元相同的進行匹配),第一個行轉列轉換的是資料,第二個為型別,where限制了比較前五個字元,我能取得匹配的資料組。


2、PIVOT 操作符(行轉列)

 SELECT year as 年份
        , sum (case when quarter = 'Q1' then amount else 0 end) 一季度
        , sum (case when quarter = 'Q2' then amount else 0 end) 二季度
        , sum (case when quarter = 'Q3' then amount else 0 end) 三季度
        , sum (case when quarter = 'Q4' then amount else 0 end) 四季度
    FROM SalesByQuarter GROUP BY year ORDER BY year DESC

				
SELECT year as 年份, Q1 as 一季度, Q2 as 二季度, Q3 as 三季度, Q4 as 四季度 FROM SalesByQuarter PIVOT (SUM (amount) FOR quarter IN (Q1, Q2, Q3, Q4) ) AS P ORDER BY YEAR DESC

			

得到的結果如下:




MySQL

列轉行:利用max(case when then)

-- ------------------------ -- 列轉行統計資料 -- ------------------------ SELECT Date , MAX(CASE NAME WHEN '小說' THEN Scount ELSE 0 END ) 小說, MAX(CASE NAME WHEN '微信' THEN Scount ELSE 0 END ) 微信 FROM TabName  GROUP BY Date  <br><br>

利用graup_cancat(name1,”;”,”name2”)

select Date, group_concat(NAME,'總量:',Scount) as b_str from   TabName group by Date
select Date,NAME, group_concat(NAME,'總量:',Scount) as b_str from   TabName group by Date ,NAME

相關推薦

SQL學習--資料庫 行列轉換

SQLServer 1、UNPIVOT 操作符 UNPIVOT操作符就是取得一個行的資料集合,然後把每一行都轉換成多個行資料。 UNPIVOT 語法 下面就是 UNPIVOT 的語法: SELECT [columns not unpivoted], [unp

MySQL學習資料庫安裝與配置全程圖解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL資料庫學習SQL語言基本語法

一、什麼是資料庫 資料庫(Database)是按照資料結構來組織、儲存和管理資料的倉庫。 每個資料庫都有一個或多個不同的API用於建立,訪問,管理,搜尋和複製所儲存的資料。 通常使用關係型資料庫管理系統(RDBMS)來儲存和管理的大資料量。 所謂的關係型資料庫,是建立在關係模

SQL語句學習----通用語法,DDL,DML基礎語句

生效 mod 當前 輸入 ddl 窗口 str integer structure 1.1 SQL概述 1.1.1 SQL語句介紹   結構化查詢語言(Structured Query Language)簡稱SQL,是關系型數據庫管理系統都需要遵循的規範。不

BeetlSQL框架學習——初識BeetlSQL,特點,內置sql的使用,Pojo代碼生成等

spa imp 文件 無需 結束 innodb inter tostring postgre 學習BeetlSQL總結(1)一.BeetlSQL特點:1.開發效率:(1)無需註解,能自動使用大量的內置sql,快速完成增,刪,改,查的功能(2)數據模型支持Pojo,也支持Ma

PostgreSQL資料庫核心分析學習

PostgreSQL 資料庫由連線管理系統(系統控制器)、編譯執行系統、儲存管理系統、事務系統和系統表五大部分組成。 2.1系統表 資料字典是關係資料庫系統管理控制資訊的核心 在postgreSQL資料庫系統中,系統表扮演資料字典的角色 存放結構元資料,

HIVE簡明教程學習筆記——資料庫及表的操作HIVE DDL

1.建立資料庫 create database if not exists aa_db; 2.檢視資料庫定義 describe database aa_db; 3.檢視資料庫列表 show databases; 4.刪除資料庫 drop database if exists testdb casca

SQL必知必會學習

自從爬蟲稍微入門之後,又抽出一段時間著重學習EXCEL函式和透視表,其中以函式為主。今天開始學習SQL,幾個月前曾通讀了一遍《SQL必知必會》,但是沒有具體操作過。今天重新開啟workbench才發現之前在爬蟲的時候用的知識又有些生疏了,所以覺得有必要寫個部落格,防止自己再次生疏的時候,又浪費時間去

Oracle資料庫學習安裝和簡單使用

新公司的新專案,需要用到Oracle資料庫,所以現在便來解除此資料庫,不得不說,這個資料庫還這是麻煩。 安裝倒是簡單,就是中間會遇到各種問題。 安裝步驟參考:https://blog.csdn.net/fancheng614/article/details/78172894 安裝完成後,中間不要有太大的

資料庫學習

  工作中是由資料庫研發人員管理資料庫、表、資料等,作為測試,我主要還是在測試中遇到需要核對資料庫表資料時才有用到,所以我把平時用到的一些SQL語句整理了一下,以便學習。我們用到的主要是Oracle資料庫,使用的工具是PL/SQL。     PL/SQL Developer是一個整合開發環境,專門開發面向O

MySQL 基礎知識梳理學習----系統資料庫

information_schema 此資料庫是MySQL資料庫自帶的,主要儲存資料庫的元資料,儲存了關於MySQL伺服器維護的所有其他資料庫的資訊,如資料庫名、資料庫表、表列的資料型別及訪問許可權等。 這個庫在很多情況下,可以幫助我們做一些自動化處理的工作,比如巡檢程式找到所有的MyISAM表,或者是找

SQL學習2——MySQL資料庫常用的函式--聚合函式

一、聚合函式 聚合函式對一組值執行計算並返回單一的值, 聚合函式與group by子句一塊使用方能顯現它的強大, 聚合函式與其他函式的根本區別:聚合函式一般作用在多條記錄上, 聚合函式中除了count()外,都忽略空值。 **聚合函式用表: CREA

SQL基礎學習

一.SQL的定義:       SQL指結構化查詢語言,讓我們可以對資料庫進行訪問,市一中ANSI的標準計算機語言。 二.SQL的語句簡析:     1.查詢語句:          select 列名稱 from 表名稱 (查詢某一列資料)          selec

javaScript學習——js布林型別轉換

任意javascript值都可轉換成物件 undefined、null、0、-0、NaN、“”會被轉換成false,其他的值都會轉換成true。 <html> <body> <div> <form>

PL/SQL developer基礎語法學習

簡介: - PL/SQL是Oracle下的指令碼開發語言,是為了解決資料進行復雜處理而設計的。 - 在SQL語言的基礎之上添加了第三代語言的迴圈、分支等結構 - 使用PL/SQL可以帶來一定的好處,即效率的提高——– pl/s

PostgreSql資料庫學習

以下筆記根據中科院陳世敏老師PPT整理得到,侵刪。 以下命令均不區分大小寫,除了名字。 1、以下所講為ER模型,Entity-Relation Model。 4、實體:現實世界的物件 實體集,相似實體的集合,實體集之間可以有交集 一個實體集的每個實體都有相同的屬性,屬性的取值範圍

Android資料庫Realm學習基本使用

剛剛開始用Realm,肯定是要對比著SQLite來琢磨的,說幾個個人認識: 一、SQLite中的資料庫名對應Realm的啥 Realm可以簡單直接使用,這個時候似乎是弱化了資料庫名的存在,也就是這個

資料庫中介軟體 Sharding-JDBC 原始碼分析 —— SQL 解析之詞法解析

本文主要基於 Sharding-JDBC 1.5.0 正式版 ������關注微信公眾號:【芋道原始碼】有福利: 1. RocketMQ / MyCAT / Sharding-JDBC 所有原始碼分析文章列表 2. Roc

基於Oracle的SQL優化--學習

Oracle裡的優化器    Oracle裡的優化器分為RBO和CBO兩種型別,RBO是基於規則的優化器,CBO是基於成本的優化器。    Oracle資料庫的SQL語句執行過程:    基於規則的優化器   Oracle會在程式碼裡事先給各個型別的執行路徑定一個等級,從等級

Qt資料庫利用QSqlQuery類執行SQL語句

SQL即結構化查詢語言,是關係資料庫的標準語言。前面已經提到,在Qt中利用QSqlQuery類實現了執行SQL語句。需要說明,我們這裡只是Qt教程,而非專業的資料庫教程,所以我們不會對資料庫中的一些知識進行深入講解,下面只是對最常用的幾個知識點進行講解。我們下面先建立一個工程,然後講解四個知識點,分別是:一,