從這一篇開始要總結的是透視和逆透視,那么什么是透視和逆透視呢?透視是將數據從行的狀態轉換成列的狀態,而逆透視則是將數據從列的狀態轉換成行的狀態。它們一般應用在生成報表的場景中。
每個透視轉換都會涉及三個邏輯處理階段,每個階段都有相關元素;分組階段處理相關的分組或行元素,擴展(SPReading)階段處理相關的擴展或列元素,聚合階段處理相關的聚合元素和聚合函數。
下面是一個關于透視轉換的示例。
USE tempdb;GO-- 透視轉換-- 準備測試數據IF OBJECT_ID('dbo.Orders','U') IS NOT NULL DROP TABLE dbo.Orders;GOCREATE TABLE dbo.Orders( orderid INT NOT NULL, orderdate DATETIME NOT NULL, 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); -- 原始的行狀態(生成的一個報表,包含每個職員和客戶組合之間的總訂貨量)SELECT empid,custid,SUM(qty) AS sumqty FROM dbo.OrdersGROUP BY empid,custid;
得到原始行的狀態,如下圖:
實現透視轉換有兩種解決方案,一是使用標準的SQL,另一種是使用PIVOT運算符進行轉換。下面是示例代碼。
-- 1,使用標準SQLSELECT 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.OrdersGROUP BY empid;-- 2,PIVOT運算符SELECT empid,A,B,C,DFROM (SELECT empid,custid,qty FROM dbo.Orders) AS DPIVOT(SUM(D.qty) FOR D.custid IN (A,B,C,D)) AS P;
透視轉換后的效果如下圖。
新聞熱點
疑難解答