在mysql表中如何变换列和行_在SQL中转换列和行的简单方法?
有幾種方法可以轉換這些數據。在你最初的帖子中,你說PIVOT對于這個場景來說似乎太復雜了,但是可以很容易地使用UNPIVOT和PIVOTSQL Server中的函數。
但是,如果您無法訪問這些函數,則可以使用UNION ALL到UNPIVOT然后是一個具有CASE向PIVOT:
創建表:CREATE?TABLE?yourTable([color]?varchar(5),?[Paul]?int,?[John]?int,?[Tim]?int,?[Eric]?int);INSERT?INTO?yourTable
([color],?[Paul],?[John],?[Tim],?[Eric])VALUES
('Red',?1,?5,?1,?3),
('Green',?8,?4,?3,?5),
('Blue',?2,?2,?9,?1);
UNION All,聚合和案例版本:select?name,
sum(case?when?color?=?'Red'?then?value?else?0?end)?Red,
sum(case?when?color?=?'Green'?then?value?else?0?end)?Green,
sum(case?when?color?=?'Blue'?then?value?else?0?end)?Bluefrom(
select?color,?Paul?value,?'Paul'?name??from?yourTable??union?all
select?color,?John?value,?'John'?name??from?yourTable??union?all
select?color,?Tim?value,?'Tim'?name??from?yourTable??union?all
select?color,?Eric?value,?'Eric'?name??from?yourTable)?srcgroup?by?name
這個UNION ALL執行UNPIVOT通過轉換列來對數據進行轉換。Paul, John, Tim, Eric分成幾排。然后應用聚合函數。sum()帶著case語句獲取每個列的新列。color.
樞軸和樞軸靜態版本:
雙雙UNPIVOT和PIVOTSQL Server中的函數使這種轉換更加容易。如果您知道要轉換的所有值,可以將它們硬編碼到靜態版本中以獲得結果:select?name,?[Red],?[Green],?[Blue]from(
select?color,?name,?value??from?yourtable??unpivot
(
value?for?name?in?(Paul,?John,?Tim,?Eric)
)?unpiv)?srcpivot(
sum(value)
for?color?in?([Red],?[Green],?[Blue]))?piv
對象的內部查詢。UNPIVOT執行與UNION ALL..它獲取列的列表并將其轉換為行,PIVOT然后執行最后的列轉換。
動態透視版本:
如果有未知數量的列(Paul, John, Tim, Eric(在您的示例中),然后要轉換的顏色數目未知,您可以使用動態SQL將列表生成為UNPIVOT然后PIVOT:DECLARE?@colsUnpivot?AS?NVARCHAR(MAX),
@query??AS?NVARCHAR(MAX),
@colsPivot?as??NVARCHAR(MAX)select?@colsUnpivot?=?stuff((select?','+quotename(C.name)
from?sys.columns?as?C?????????where?C.object_id?=?object_id('yourtable')?and
C.name?<>?'color'
for?xml?path('')),?1,?1,?'')select?@colsPivot?=?STUFF((SELECT??','
+?quotename(color)
from?yourtable?t????????????FOR?XML?PATH(''),?TYPE????????????).value('.',?'NVARCHAR(MAX)')
,1,1,'')set?@query
=?'select?name,?'+@colsPivot+'
from
(
select?color,?name,?value
from?yourtable
unpivot
(
value?for?name?in?('+@colsUnpivot+')
)?unpiv
)?src
pivot
(
sum(value)
for?color?in?('+@colsPivot+')
)?piv'exec(@query)
動態版本同時查詢兩個yourtable然后sys.columns表生成項的列表。UNPIVOT和PIVOT..然后將其添加到要執行的查詢字符串中。動態版本的優點是如果您有一個更改列表colors和/或names這將在運行時生成列表。
這三個查詢都將產生相同的結果:
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |? ?3 |? ? ?5 |? ? 1 |
| John |? ?5 |? ? ?4 |? ? 2 |
| Paul |? ?1 |? ? ?8 |? ? 2 |
|? Tim |? ?1 |? ? ?3 |? ? 9 |
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的在mysql表中如何变换列和行_在SQL中转换列和行的简单方法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HMM隐马尔科夫模型及股票预测
- 下一篇: ie11不兼容 html编辑器,ie11