說下查詢動作 Pivot

来源:http://www.cnblogs.com/Gin-23333/archive/2016/03/01/5231316.html
-Advertisement-
Play Games

上一篇說了一下查詢5步走~然後就幾天_(:з」∠)_ ~今天繼續說一下其中 表裡面操作符裡面的 Pivot ~ Pivot 在實現行轉列的時候灰常有用。通常一個例子 CREATE TABLE #Tbl (Emp VARCHAR(50), [WeekDay] VARCHAR(50),LoginTime


上一篇說了一下查詢5步走~然後就幾天_(:з」∠)_ ~今天繼續說一下其中 表裡面操作符裡面的 Pivot ~ 

Pivot 在實現行轉列的時候灰常有用。通常一個例子

CREATE TABLE #Tbl (Emp VARCHAR(50), [WeekDay] VARCHAR(50),LoginTime TIME)

 
INSERT INTO #Tbl
        ( Emp, WeekDay, LoginTime )
VALUES  ( 'Mart','Mon','09:00'),( 'Mart','TUE','08:55'),( 'Mart','Wed','09:02'),( 'Mart','Thu','08:50'),
        ( 'Ken','Mon','09:00'),( 'Ken','TUE','08:53'),( 'Ken','Wed','09:03'),( 'Ken','Thu','08:51'),
        ( 'Reach','Mon','09:00'),( 'Reach','TUE','08:51'),( 'Reach','Wed','09:04'),( 'Reach','Thu','08:57')

SELECT 
    * 
    FROM #Tbl PIVOT(MIN(LoginTime) FOR [WeekDay] IN ([Mon],[Tue],[Wed],[Thu])) AS a

Emp                                                Mon              Tue              Wed              Thu
-------------------------------------------------- ---------------- ---------------- ---------------- ----------------
Ken                                                09:00:00.0000000 08:53:00.0000000 09:03:00.0000000 08:51:00.0000000
Mart                                               09:00:00.0000000 08:55:00.0000000 09:02:00.0000000 08:50:00.0000000
Reach                                              09:00:00.0000000 08:51:00.0000000 09:04:00.0000000 08:57:00.0000000

這樣簡單就搞掂了一個行轉列。

其實在這個步驟裡面,Pivot 運算符就幹了3件事~

1、分組:首先 Pivot 會將裡面沒有被提及的欄位,在我的這個例子裡面,就是將 Emp 加上 For 裡面提及的 WeekDay 來分組。當然,這一步是不會影響到外部的Group by 語句的, 因為Povit 僅僅相當於 from 裡面的一個運算,生成一個輸入表,提供給下一步操作使用而已

(想象狀態,這是經過步驟1 得出的虛擬表)

Emp                                                WeekDay                                            LoginTime
-------------------------------------------------- -------------------------------------------------- ----------------
Ken                                                Mon                                                09:00:00.0000000
Mart                                               Mon                                                09:00:00.0000000
Reach                                              Mon                                                09:00:00.0000000
Ken                                                Thu                                                08:51:00.0000000
Mart                                               Thu                                                08:50:00.0000000
Reach                                              Thu                                                08:57:00.0000000
Ken                                                TUE                                                08:53:00.0000000
Mart                                               TUE                                                08:55:00.0000000
Reach                                              TUE                                                08:51:00.0000000
Ken                                                Wed                                                09:03:00.0000000
Mart                                               Wed                                                09:02:00.0000000
Reach                                              Wed                                                09:04:00.0000000

有沒有很熟悉,其實跟這句查詢語句得出的結果一樣

SELECT a.Emp,a.WeekDay,MIN(a.LoginTime) AS LoginTime
    FROM #Tbl a
    GROUP BY a.Emp,a.WeekDay

 

2、擴展:分組完成。之後,需要將 In () 包含的欄位擴展出來。在這個例子裡面就是要擴充到 'Mon','Tue','Wed','Thu' 這4個位置。要對於指定的列,才聚合數值,否則則為 Null.

MIN(CASE WHEN a.WeekDay = 'Mon' THEN a.LoginTime ELSE NULL END) AS [Mon],
    MIN(CASE WHEN a.WeekDay = 'Tue' THEN a.LoginTime ELSE NULL END) AS [Tue],
    MIN(CASE WHEN a.WeekDay = 'Wed' THEN a.LoginTime ELSE NULL END) AS [Wed],
    MIN(CASE WHEN a.WeekDay = 'Thu' THEN a.LoginTime ELSE NULL END) AS [Thu]

當然羅  Min 這個運算符,是跟Pivot 裡面輸入的操作符一致的~

 

3、 聚合。有了第二步,聚合個結果列就OK了。就得出我們上面的結果~

 

以上~

參考 :<Sql server 2008 技術內幕 查詢>

 

    

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 -- create function 2 create function [dbo].[fnXmlToJson] (@XmlData xml) 3 returns nvarchar(max) 4 as 5 begin 6 return 7 (select stuff( 8 (select 9 *
  • Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重覆性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。 存儲過程相對於其他的資料庫訪問方法有以下的優點: (1)重覆使用。存儲過程可以重覆使用,從而可以減少資料庫開發人員的
  • mysql 主從 複製
  • 1、以下是一個簡單事務存儲過程,其中Users表ID為主鍵 CREATE PROCEDURE SP_TRANSACTIONAS BEGIN BEGIN TRANSACTION INSERT INTO USERS(ID,NAME)VALUES(1000,'TEST1000'); IF @@ERROR<
  • GRANT privilege [, ...] ON object [ ( column [, ...] ) ] [, ...] TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ] 這些欄位與 Postgres 實現是相容的,除了下麵一些例外
  • (1)選擇最有效率的表名順序(只在基於規則的優化器中有效):Oracle的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查
  • 本文內容 Elasticsearch logstash 本文介紹安裝 logstash 2.2.0 和 elasticsearch 2.2.0,操作系統環境版本是 CentOS/Linux 2.6.32-504.23.4.el6.x86_64。 安裝 JDK 是必須的,一般操作系統都會有,只是版本的...
  • 關係型資料庫的定義及設計思路
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...