Sql 将行转移到列
我在xml中有类似的内容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)
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