Sql 将行转移到列

Sql 将行转移到列,sql,sql-server,Sql,Sql Server,我在xml中有类似的内容 c1.1 test c1.2 10 c1.3 100 c2.1 test1 c2.2 10 c2.3 1000 我想变成这样 test 10 100 test1 10 1000 请帮助。我尝试了pivot,但无法破解它。这里需要指出的是,c1.1、c1.2、c1.3是一个系列,这3个系列必须在I行中pivot将完全执行您想要的操作,如下所示: select * from ( select left(type,2)

我在xml中有类似的内容

c1.1    test
c1.2    10
c1.3    100
c2.1    test1
c2.2    10
c2.3    1000
我想变成这样

test    10  100
test1   10  1000

请帮助。我尝试了pivot,但无法破解它。这里需要指出的是,c1.1、c1.2、c1.3是一个系列,这3个系列必须在I行中

pivot将完全执行您想要的操作,如下所示:

select * from (
  select left(type,2) as row, right(type, 1) as col, value 
  from Table1
) S pivot (
  max(value) for col in ([1], [2], [3])
) P
举例

MS SQL Server 2014架构设置:

问题1:

:


在SQLServer2008模式设置中,我们可以使用Row\u编号来完成。基于示例数据,我给出了这段代码

DECLARE @Table1 TABLE 
    (val varchar(4), col varchar(5))
;

INSERT INTO @Table1
    (val, col)
VALUES
    ('c1.1', 'test'),
    ('c1.2', '10'),
    ('c1.3', '100'),
    ('c2.1', 'test1'),
    ('c2.2', '10'),
    ('c2.3', '1000')
;
Select [1] as [Value1],[2] as [Value2],[3] as [Value3]from (
select SUBSTRING(reverse(val),0,CHARINDEX('.',Reverse(val))) R,
col
,ROW_Number()OVER(PARTITION BY SUBSTRING(reverse(val),0,CHARINDEX('.',reverse(val))) Order by val) RN
 from @Table1)T
PIVOT(max(col) for R IN ([1],[2],[3]))PVT 

对我来说,听起来像是一个典型的支点。另一种方法是交叉表,我更喜欢交叉表,因为它的语法不那么迟钝,性能通常稍好一些。有时您会听说交叉表被称为条件聚合。请发布您的PIVOT尝试和由此产生的错误,以便我们可以帮助您进行调试。chemicalKeyName chemicalValueName 1化学名称:EFEFEF 1化学百分比:24 1 CAS:第1行2 3 1 CAS:NULL NULL NULL 1化学名称:NULL NULL NULL 1化学名称百分比:NULL这是我得到的。使用的查询是select*从select leftChemicalKeyName,29作为行,rightChemicalKeyName,45作为列,ChemicalValueName从@temp S pivot maxChemicalValueName为[1],[2],[3]中的列发布了我的pivot尝试什么XML?为什么不通过以XML形式提供数据来解决整个问题呢?和将完整尝试的pivot查询放入问题中,而不是commentchemicalKeyName chemicalValueName 1化学名称:efef 1化学百分比:24 1 CAS:第1行2 3 1 CAS:NULL NULL NULL 1化学名称:NULL NULL NULL 1化学百分比:NULL NULL NULL这是我得到的结果。使用的查询为从[1]、[2]、[3]中的列选择leftChemicalKeyName、29作为行、rightChemicalKeyName、45作为列、ChemicalValueName从@temp S pivot maxChemicalValueName中选择*P@joe这是一个迟来的答案。如果这是你想要的,就试一下
select
      Value1, Value2, Value3
from (
      select
             Value as Value1
           , lead(Value,1) over(partition by left(t1.code,charindex('.',t1.code)-1)
                                order by substring(t1.code,charindex('.',t1.code)+1,len(t1.code))) as Value2
           , lead(Value,2) over(partition by left(t1.code,charindex('.',t1.code)-1)
                                order by substring(t1.code,charindex('.',t1.code)+1,len(t1.code))) as Value3

      from table1 t1
     ) as derived
where Value3 is not null
| Value1 | Value2 | Value3 |
|--------|--------|--------|
|   test |     10 |    100 |
|  test1 |     10 |   1000 |
DECLARE @Table1 TABLE 
    (val varchar(4), col varchar(5))
;

INSERT INTO @Table1
    (val, col)
VALUES
    ('c1.1', 'test'),
    ('c1.2', '10'),
    ('c1.3', '100'),
    ('c2.1', 'test1'),
    ('c2.2', '10'),
    ('c2.3', '1000')
;
Select [1] as [Value1],[2] as [Value2],[3] as [Value3]from (
select SUBSTRING(reverse(val),0,CHARINDEX('.',Reverse(val))) R,
col
,ROW_Number()OVER(PARTITION BY SUBSTRING(reverse(val),0,CHARINDEX('.',reverse(val))) Order by val) RN
 from @Table1)T
PIVOT(max(col) for R IN ([1],[2],[3]))PVT