簡體   English   中英

SQL Server將表的列值轉換為名稱,如果沒有列的值,則將0分配給新列

[英]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

SQL小提琴

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM