很多時候,我們需要進行數據分析,而數據分析最基礎的操作就是對數據進行匯總統計。然而,在實際的工作中,我們常常會遇到需要將行轉列的需求。通常情況下,我們可能需要處理各類數據,比如從媒體網站下載數據、進行採購分析、進行銷售統計等。在這些情況下,我們往往需要將原始數據的行轉換成列或將列轉換成行,以便於後續的分析工作。在本文中,我們將介紹一些最新的SQL Server技巧,幫助你將行轉列,實現完美的數據分析。
一、使用PIVOT方法將行轉列
Pivot操作是SQL Server中實現行轉列的一種方法。它可以將一張表的多行轉換成一行,同時把多個列轉換成一個列。下面是一個示例代碼:
SELECT [Category],
[Fruit],
[Price] AS [2010 price],
[Quantity] AS [2010 quantity],
[2011 price],
[2011 quantity],
[2012 price],
[2012 quantity]
FROM
( SELECT t1.Category,
t1.Fruit,
t1.Price,
t1.Quantity,
'20'+ RIGHT(t2.Year,2) AS Year,
t2.Type
FROM MyTable t1 CROSS JOIN
(SELECT '2010' AS Year, 'price' AS Type UNION ALL
SELECT '2010' AS Year, 'quantity' AS Type UNION ALL
SELECT '2011' AS Year, 'price' AS Type UNION ALL
SELECT '2011' AS Year, 'quantity' AS Type UNION ALL
SELECT '2012' AS Year, 'price' AS Type UNION ALL
SELECT '2012' AS Year, 'quantity' AS Type) t2
WHERE t1.PK = 1
) AS T
PIVOT (SUM(Price) FOR [Year] IN ([2010], [2011], [2012])) AS p1
PIVOT (SUM(Quantity) FOR [Year] IN ([2010], [2011], [2012])) AS p2;
上述代碼中,我們首先使用CROSS JOIN聯接,獲得一個具有6個年份、每個年份下都有價格和數量兩個指標的臨時表。然後,我們將這個臨時表作為子查詢,通過PIVOT的方法,將其進行行轉列操作,最終得到最終的結果。
二、使用UNPIVOT方法將列轉行
有時候,我們需要將列轉換成行來進行數據分析。為了實現這個目標,我們可以使用UNPIVOT方法。UNPIVOT操作和PIVOT操作正好相反,它將一張表的多列轉換成多行,並把多個列轉換成一個列。下面是一個示例代碼:
SELECT [ID],
[Year],
[Product],
[Sales]
FROM
( SELECT [ID],
[2010 sales] AS [2010],
[2011 sales] AS [2011],
[2012 sales] AS [2012]
FROM MyTable
) AS T
UNPIVOT (Sales FOR Year IN ([2010], [2011], [2012])) AS p1
UNPIVOT (Product FOR Product IN ([Product1], [Product2], [Product3])) AS p2;
上述代碼中,我們首先將原始表中的多個指標的列名以及每個列的實際值都通過UNPIVOT方法,轉換成了一個ColumnName和Value兩列的表。然後,我們將ProductName和Year再次進行UNPIVOT操作,得到了最終需要的結果。
三、使用動態SQL進行行列轉換
以上的兩種方法在處理簡單的行列轉換任務時非常便利,但是如果 dealing with a more complex data 轉化任務,我們需要處理數千列和數百萬行,這時我們是不能硬編碼每一列的列名的。但是,我們可以使用動態SQL,在運行時動態生成需要的SQL語句。
SELECT [Group],
[Year],
[SUM1],
[SUM2],
[SUM3],
[SUM4],
[SUM5],
[SUM6],
[SUM7],
[SUM8],
[SUM9],
[SUM10]
FROM
( SELECT [Group],
CONVERT(NVARCHAR(4), [Year]) AS [Year],
[Value],
'SUM' + CONVERT(NVARCHAR(2), ROW_NUMBER() OVER (PARTITION BY [Group], [Year] ORDER BY (SELECT 1))) AS [ColumnName]
FROM MyTable
) AS T
PIVOT (SUM(Value) FOR [ColumnName] IN ([SUM1], [SUM2], [SUM3], [SUM4], [SUM5], [SUM6], [SUM7], [SUM8], [SUM9], [SUM10])) AS p1;
上述代碼中,我們首先將原始表的數據通過一個子查詢得到兩列,一個是年份,一個是值。然後,我們生成了一個動態的ColumnName,並使用PIVOT操作進行了行轉列。在以上的查詢中,我們利用了ROW_NUMBER函數將相同Group、Year組合內的數據進行排序。最終,我們得到了需要的數據。
四、多級PIVOT
有時候,我們的數據分析需要進行多次的行列轉換操作,比如需要根據不同的指標進行不同的統計,這時候,我們可以使用多級PIVOT的方法來實現。下面是一個示例代碼:
SELECT [Category],
[Year],
ISNULL([Apples], 0) AS [Apples],
ISNULL([Bananas], 0) AS [Bananas],
ISNULL([Oranges], 0) AS [Oranges],
ISNULL([Pears], 0) AS [Pears],
ISNULL([Grapes], 0) AS [Grapes]
FROM
( SELECT t1.Category,
t1.Fruit,
t1.Price,
t1.Quantity,
'20'+ RIGHT(t2.Year,2) AS Year,
t2.Type
FROM MyTable t1 CROSS JOIN
(SELECT '2010' AS Year, 'price' AS Type UNION ALL
SELECT '2010' AS Year, 'quantity' AS Type UNION ALL
SELECT '2011' AS Year, 'price' AS Type UNION ALL
SELECT '2011' AS Year, 'quantity' AS Type UNION ALL
SELECT '2012' AS Year, 'price' AS Type UNION ALL
SELECT '2012' AS Year, 'quantity' AS Type) t2
WHERE t1.PK = 1
) AS T
PIVOT (SUM(Price) FOR [Year] IN ([2010], [2011], [2012])) AS p1
PIVOT (SUM(Quantity) FOR [Year] IN ([2010], [2011], [2012])) AS p2
PIVOT (SUM(Quantity * Price) FOR [Fruit] IN ([Apples], [Bananas], [Oranges], [Pears], [Grapes])) AS p3;
上述代碼中,我們在每次的PIVOT操作之前,都生成了一張只包含需要的列的表。這樣,我們可以通過多次PIVOT來實現行列轉換,並最終得到需要的結果。
五、總結
在本文中,我們介紹了如何使用最新的SQL Server技巧,將行轉列,實現完美的數據分析。其中,我們介紹了PIVOT方法和UNPIVOT方法,以及如何使用動態SQL來生成需要的SQL代碼,還講述了多級PIVOT的使用。希望這些技巧能夠幫助你在實踐中更加高效地完成數據分析工作。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/297825.html