SQL Server基于另一个表填充表,子字符串作为列名

时间:2015-09-29 16:46:42

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我想基于给定的表填充表格:

给出表t1:

 id1 (string), id2 (string), value (float)
 tyb            uanwe_A        6963       
 tyb            uanwe_B        979       
 tyb            uanwe_C        931       

我需要:

 id1, id2,   vA,   vB,    vC
 tyb  uanwe  6963   979  931 

我的SQL服务器查询:

 select case substring(id2, 6, 1)
        when 'A' then [value]
        end as [vA]
 from t1

但是,这对我不起作用,因为在子串(id2,6,1)不是'A'的情况下我得到了很多“null”。

 select case substring(id2, 6, 1)
        when 'A' then [value]  end as [vA]
        when 'B' then [value]  end as [vB]
        when 'C' then [value]  end as [vC]
     end 
 from t1

我觉得错误:

  Incorrect syntax near the keyword 'when'.

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我希望这会对你有所帮助

 declare @temp table
 (id1 nvarchar(99), id2 nvarchar(99), value int)
 insert into @temp values ('tyb','uanwe_A',6963)       
 insert into @temp values ('tyb','uanwe_B',979 )      
 insert into @temp values ('tyb','uanwe_C',931 )   

select id1, substring(id2,1, 5) id2, 
        max(case substring(id2,7, 1)
        when 'A' then value  end) vA,
        max(case substring(id2,7, 1)
        when 'B' then value   end) vB,
        max(case substring(id2,7, 1)
        when 'C' then value  end) vC
from @temp GROUP BY id1,substring(id2,1, 5)

答案 1 :(得分:1)

尝试PIVOT

<强> SQL Fiddle Demo

-- Pivot table with one row and five columns
SELECT [id1], [uanwe_A], [uanwe_B], [uanwe_C]
FROM
(   SELECT [id1], [id2], [value]
    FROM table1) AS SourceTable
PIVOT
(
AVG([value])
FOR [id2] IN ([uanwe_A], [uanwe_B], [uanwe_C])
) AS PivotTable;

<强>输出

我添加了另一个id1以使示例更清晰

| id1 | uanwe_A | uanwe_B | uanwe_C |
|-----|---------|---------|---------|
| tyb |    6963 |     979 |     931 |
| tyC |     111 |     222 |     333 |