SQL server基于另一个以子字符串作为列名的表填充表

SQL server基于另一个以子字符串作为列名的表填充表,sql,sql-server,sql-server-2008,sql-server-2008-r2,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

我想基于给定的表填充一个表:

给定表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 server查询:

 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'.
任何帮助都将不胜感激。

试试看

-- 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 |
试一试

-- 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 |
试一试

-- 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 |
试一试

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

我希望这对你有帮助

 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)

我希望这对你有帮助

 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)

我希望这对你有帮助

 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)

我希望这对你有帮助

 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)


为什么不工作?您得到了一个错误或与预期不同的结果?因为在子字符串(id2,6,1)不是“a”的情况下,我得到了许多“null”。为什么不工作?您得到了一个错误或与预期不同的结果?因为在子字符串(id2,6,1)不是“a”的情况下,我得到了许多“null”。为什么不工作?您得到了一个错误或与预期不同的结果?因为在子字符串(id2,6,1)不是“a”的情况下,我得到了许多“null”。为什么不工作?如果子字符串(id2,6,1)不是“a”,则会出现错误或与预期不同的结果?因为在这种情况下,我得到了许多“null”。它对我不起作用。如果是“B”,我需要把它写在“vB”栏,然后重写你的问题。因为这不是你要问的,也请阅读“现在检查”。我用的是PIVOT而不是PIVOT你能稍微扩展一下你的示例数据吗?所以我可以看到还有什么其他类型的
id2
,或者仅仅是这3个?它对我不起作用。如果是“B”,我需要把它写在“vB”栏,然后重写你的问题。因为这不是你要问的,也请阅读“现在检查”。我用的是PIVOT而不是PIVOT你能稍微扩展一下你的示例数据吗?所以我可以看到还有什么其他类型的
id2
,或者仅仅是这3个?它对我不起作用。如果是“B”,我需要把它写在“vB”栏,然后重写你的问题。因为这不是你要问的,也请阅读“现在检查”。我用的是PIVOT而不是PIVOT你能稍微扩展一下你的示例数据吗?所以我可以看到还有什么其他类型的
id2
,或者仅仅是这3个?它对我不起作用。如果是“B”,我需要把它写在“vB”栏,然后重写你的问题。因为这不是你要问的,也请阅读“现在检查”。我用的是PIVOT而不是PIVOT你能稍微扩展一下你的示例数据吗?因此,我可以看到还有什么类型的
id2
,或者只有这3种?不,我需要的是值,而不是新表中填写的列名。@user3750163查看更新的答案如果您使用sql fiddle发布下一次的Q将是非常好的,这样您可以获得最准确的esapNo,我需要值,而不是新表中填写的列名。@user3750163请查看更新的答案。如果您使用sql FIDLE发布下一次的Q,那就太好了,这样您就可以获得最准确的esapNo,我需要值,而不是新表中填写的列名。@user3750163请查看更新的答案。如果您使用sql FIDLE发布下一次的Q,那就太好了,这样您就可以获得最准确的esapNo,我需要值,而不是新表中填写的列名。@user3750163请查看更新的答案。如果您使用sql FIDLE发布下一次的Q,那将非常好,这样您就可以获得最准确的esap