繁体   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