狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

SQL Server 使用 PIVOT 和 UNPIVOT 實現多條行記錄轉置為列表

admin
2023年6月28日 9:16 本文熱度 774

可以使用 PIVOT 和 UNPIVOT 關系運算符將表值表達式更改為另一個表。 PIVOT 通過將表達式中的一個列的唯一值轉換為輸出中的多列,來輪替表值表達式。 PIVOT 在需要對最終輸出所需的所有剩余列值執行聚合時運行聚合。 與 PIVOT 執行的操作相反,UNPIVOT 將表值表達式的列輪換為列值。

注意

對升級到 SQL Server 2005 或更高版本的數據庫使用 PIVOT 和 UNPIVOT 時,必須將數據庫的兼容級別設置為 90 或更高。有關如何設置數據庫兼容級別的信息,請參閱 sp_dbcmptlevel (Transact-SQL)

PIVOT 提供的語法比一系列復雜的 select...CASE 語句中所指定的語法更簡單和更具可讀性。 有關 PIVOT 語法的完整說明,請參閱 from (Transact-SQL)

語法

以下語法總結了如何使用 PIVOT 運算符:

select <non-pivoted column>

    [first pivoted column] AS <column name>

    [second pivoted column] AS <column name>

    ... 

    [last pivoted column] AS <column name> 

from 

    (<select query that produces the data>)  

    AS <alias for the source query> 

PIVOT 

    <aggregation function>(<column being aggregated>

FOR  

[<column that contains the values that will become column headers>]  

    IN ( [first pivoted column], [second pivoted column], 

    ... [last pivoted column]) 

) AS <alias for the pivot table> 

<optional ORDER BY clause> 

11

以下是帶批注的 PIVOT 語法:

select <非透視的列>,

    [第一個透視的列] AS <列名稱>,

    [第二個透視的列] AS <列名稱>,

    ...

    [最后一個透視的列] AS <列名稱>,

from

    (<生成數據的 select 查詢>)

    AS <源查詢的別名>

PIVOT

(

    <聚合函數>(<要聚合的列>)

FOR

[<包含要成為列標題的值的列>]

    IN ( [第一個透視的列], [第二個透視的列],

    ... [最后一個透視的列])

) AS <透視表的別名>

<可選的 ORDER BY 子句>;

備注

UNPIVOT 子句中的列標識符需遵循目錄排序規則。對于 SQL 數據庫,排序規則始終是 SQL_Latin1_General_CP1_CI_AS。對于 SQL Server 部分包含的數據庫,排序規則始終是 Latin1_General_100_CI_AS_KS_WS_SC。如果將該列與與其他列合并,則需要 collate 子句 (COLLATE DATABASE_DEFAULT) 以避免沖突。

簡單 PIVOT 示例

下面的代碼示例生成一個兩列四行的表:

USE AdventureWorks2014 ; 

GO 

select DaysToManufacture, AVG(StandardCost) AS AverageCost  

from Production.Product 

GROUP BY DaysToManufacture;  

下面是結果集:

DaysToManufacture AverageCost

----------------- -----------

0                 5.0885

1                 223.88

2                 359.1082

4                 949.4105

沒有定義 DaysToManufacture 為 3 的產品。

以下代碼顯示相同的結果,該結果經過透視以使 DaysToManufacture 值成為列標題。提供一個列表示三 [3] 天,即使結果為 NULL

-- Pivot table with one row and five columns 

select 'AverageCost' AS Cost_Sorted_By_Production_Days,  

  [0], [1], [2], [3], [4] 

from 

(

  select DaysToManufacture, StandardCost  

  from Production.Product

) AS SourceTable 

PIVOT 

  AVG(StandardCost) 

  FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 

) AS PivotTable;  

下面是結果集:

Cost_Sorted_By_Production_Days 0           1           2           3           4        

------------------------------ ----------- ----------- ----------- ----------- -----------

AverageCost                    5.0885      223.88      359.1082    NULL        949.4105

復雜 PIVOT 示例

若要生成交叉表報表來匯總數據,通常可能會發現 PIVOT 很有用。例如,假設需要在 PurchaseOrderHeader 示例數據庫中查詢 AdventureWorks2014 表以確定由某些特定雇員所下的采購訂單數。以下查詢提供了此報表(按供應商排序):

USE AdventureWorks2014; 

GO 

select VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5 

from  

(select PurchaseOrderID, EmployeeID, VendorID 

from Purchasing.PurchaseOrderHeader) p 

PIVOT 

COUNT (PurchaseOrderID) 

FOR EmployeeID IN 

( [250], [251], [256], [257], [260] ) 

) AS pvt 

ORDER BY pvt.VendorID;  

以下為部分結果集:

VendorID    Emp1        Emp2        Emp3        Emp4        Emp5 

----------- ----------- ----------- ----------- ----------- -----------

1492        2           5           4           4           4

1494        2           5           4           5           4

1496        2           4           4           5           5

1498        2           5           4           4           4

1500        3           4           4           5           4

將在 EmployeeID 列上透視此嵌套 select 語句返回的結果:

select PurchaseOrderID, EmployeeID, VendorID 

from PurchaseOrderHeader; 

EmployeeID 列返回的唯一值變成了最終結果集中的字段。因此,在 pivot 子句中指定的每個 EmployeeID 號都有對應的列:在此示例中,為員工 250251256257 和 260PurchaseOrderID 列作為值列,將根據此列對最終輸出中返回的列(稱為分組列)進行分組。在本例中,通過 COUNT 函數聚合分組列。請注意,系統會顯示警告消息,以指明在為每個員工計算 COUNT 時,未考慮 PurchaseOrderID 列中的任何 NULL 值。

重要提示

如果聚合函數與 PIVOT 一起使用,則計算聚合時將不考慮出現在值列中的任何空值。

逆透視示例

與 PIVOT 執行的操作幾乎相反,UNPIVOT 將列輪換為行。假設以上示例中生成的表在數據庫中存儲為 pvt,并且您需要將列標識符 Emp1Emp2Emp3Emp4 和 Emp5 旋轉為對應于特定供應商的行值。因此,必須標識另外兩個列。包含要輪換的列值(Emp1Emp2...)的列稱為 Employee,保留要輪換列下的現有值的列稱為 Orders。這些列分別對應于 Transact-SQL 定義中的 pivot_column 和 value_column。以下為該查詢:

-- create the table and insert values as portrayed in the previous example. 

create TABLE pvt (VendorID INT, Emp1 INT, Emp2 INT

    Emp3 INT, Emp4 INT, Emp5 INT); 

GO 

insert INTO pvt VALUES (1,4,3,5,4,4); 

insert INTO pvt VALUES (2,4,1,5,5,5); 

insert INTO pvt VALUES (3,4,3,5,4,4); 

insert INTO pvt VALUES (4,4,2,5,5,4); 

insert INTO pvt VALUES (5,5,1,5,5,5); 

GO 

-- Unpivot the table. 

select VendorID, Employee, Orders 

from  

   (select VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 

   from pvt) p 

UNPIVOT 

   (Orders FOR Employee IN  

      (Emp1, Emp2, Emp3, Emp4, Emp5) 

)AS unpvt; 

GO  

以下為部分結果集:

VendorID    Employee    Orders

----------- ----------- ------

1            Emp1       4

1            Emp2       3

1            Emp3       5

1            Emp4       4

1            Emp5       4

2            Emp1       4

2            Emp2       1

2            Emp3       5

2            Emp4       5

2            Emp5       5

...

請注意,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 執行聚合,并將多個可能的行合并為輸出中的一行。UNPIVOT 不重現原始表值表達式的結果,因為行已被合并。另外,UNPIVOT 輸入中的 NULL 值也在輸出中消失了。如果值消失,表明在執行 PIVOT 操作前,輸入中可能就已存在原始 NULL 值。

AdventureWorks2022 示例數據庫中的 Sales.vSalesPersonSalesByFiscalYears 視圖將使用 PIVOT 返回每個銷售人員在每個會計年度的總銷售額。若要在 SQL Server Management Studio 中編寫視圖腳本,請在“對象資源管理器”中的“視圖”文件夾下找到 AdventureWorks2022 數據庫對應的視圖。右鍵單擊該視圖名稱,再選擇“編寫視圖腳本為” 。

另請參閱

from (Transact-SQL)
CASE (Transact-SQL)


該文章在 2023/6/28 9:19:10 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved