[英]SQL Server convert a table column values to names and assign 0 to the new columns if no value for a column
我想在SQL Server中將表從行轉換為列。
給定表1:
id value1 value2
1 name1 9
1 name1 26
1 name1 15
2 name2 20
2 name2 18
2 name2 61
我需要一個像這樣的表:
id name1 name2
1 9 0
1 26 0
1 15 0
2 0 20
2 0 18
2 0 61
可以在這里提供幫助嗎? 由於表很大,因此首選進行轉換的有效方法。
我努力了:
select
id, name1, name2
from
(select
id, value1, value2
from table1) d
pivot
(
max(value2)
for value1 in (name1, name2)
) piv;
但是,它不能為同一ID提供所有行以與0組合。
謝謝
“秘密”是添加一列,以使“ nameX”組中的每一行具有唯一性。 我用過ROW_NUMBER
。 盡管PIVOT
需要匯總,但使用我們的“偽造的唯一性”,MAX,MIN等就足夠了。 最后一步是在外部select中將任何NULL
替換為0。
(順便說一句,我們在2014年,所以我無法在2008年測試此-抱歉)
SELECT * INTO #Demo FROM (VALUES
(1,'name1',9),
(1,'name1',26),
(1,'name1',15),
(2,'name2',20),
(2,'name2',18),
(2,'name2',61)) A (Id,Value1,Value2)
SELECT
Id
,ISNULL(Name1, 0) Name1
,ISNULL(Name2, 0) Name2
FROM
( SELECT
ROW_NUMBER() OVER ( PARTITION BY Id ORDER BY Id ) rn
,Id
,Value1
,Value2
FROM
#Demo ) A
PIVOT ( MAX(Value2) FOR Value1 IN ( [Name1], [Name2] ) ) AS P;
Id Name1 Name2
----------- ----------- -----------
1 9 0
1 26 0
1 15 0
2 0 20
2 0 18
2 0 61
您可以使用group by
case based aggregation
select id,
max(case when value1 ='name1' then value2 else 0 end) as name1,
max(case when value1 ='name2' then value2 else 0 end) as name2
from Table1
group by id, value1, value2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.