根据SQL中固定的行数将长列拆分为多列
我正在学习SQL脚本。例如,我有以下天气数据:根据SQL中固定的行数将长列拆分为多列,sql,sql-server,Sql,Sql Server,我正在学习SQL脚本。例如,我有以下天气数据: FriApr 13 Light rain 4°C 1 3° 80% 5-10 mm - 16 km/h E 1 SatApr 14 Mixed precipitation 3°C -1 -2° 90% 25-35 mm - 26 km/h NE 0 SunApr 15 Freezing rain 2°C -4 2° 80% 20-30 mm - 37 km/h NE 0 我想将这一长列拆分为多列,在每10行之后查看以下内容: FriApr 13
FriApr 13
Light rain
4°C
1
3°
80%
5-10 mm
-
16 km/h E
1
SatApr 14
Mixed precipitation
3°C
-1
-2°
90%
25-35 mm
-
26 km/h NE
0
SunApr 15
Freezing rain
2°C
-4
2°
80%
20-30 mm
-
37 km/h NE
0
我想将这一长列拆分为多列,在每10行之后查看以下内容:
FriApr 13 | SatApr 14 | SunApr 15
Light rain | Mixed precipitation | Freezing rain
4°C | 3°C | 2°C
1 | -1 | -4
3° | 2° | 2°
80% | 90% | 80%
5-10 mm | 25-35 mm | 20-30 mm
- | - | -
16 km/h E | 26 km/h NE | 37 km/h NE
1 | 0 | 0
最后要实现上面这个表的转置
Date | Condition | H3| H4| H5| H6 |H7 |H8| H9 | H10
---------------------------------------------------------------------------
FriApr 13|Light rain |4°C| 1 |3° |80% |5-10 mm |- |16 km/h E | 1
SatApr 14|Mixed precipitation|3°C|-1 |2° |90% |25-35 mm|- |26 km/h E | 0
SunApr 15|Freezing rain |2°C|-4 |2° |80% |20-30 mm| -|37 km/h E | 0
我正在使用MS SQL server 2014,并尝试在其上搜索,但找不到任何解决方案。有人能帮忙吗 可行,但有点难看。假设源是一个长字符串 范例 返回
每十行由什么顺序决定?表中的数据没有固有的顺序。您必须指定哪一列保存给您复制/粘贴到此处的结果的顺序。可能也会为这些记录共享任何其他列,因为这些列可能有助于形成答案。我会首先将转置后的列名放入原始数据集中,放在与第一列值对应的第二列中-这样,您就可以根据需要对这些值进行透视/分区,因为您的天气数据是以文件的形式存在的吗?或者数据库表中的数据列?您尝试了哪些搜索?这些数据来自哪里?你不能在它进入数据库之前把它处理成你想要的形状吗?哇,我看到了巨大的努力,非常感谢。但我期待着更简单的事情。我的意思是,如果在SQLServer中导入一个单列数据库,对其应用固定长度的拆分,是否可能?我已将上述数据复制/粘贴到excel文件的一列中,导入到SQL server中,然后想使用它。@Asif老实说,这不是一个很大的工作。我是剪贴画的大师仍然不清楚数据是表中的一个字符串还是多个行。如果是表,主要排序是什么?谢谢:我的数据不是字符串,它是一个有一列的表。我的问题类似于请看答案的第一部分,并假设其中一列的名称为“C”。在我的例子10中,他将一列拆分为固定长度5。但他的解决方案不会返回排序后的第一行1,2,3,4,5和第二行6,7,8,9102。我希望分割后的顺序保持不变。@如果您的记录中没有硬顺序/顺序,则无法确保正确的顺序。现在,如果你有另一列控制顺序,那么这可以简化。好的,我明白你的意思,从你的回答中学到了很多。再次感谢,干杯
Declare @S varchar(max) ='FriApr 13
Light rain
4°C
1
3°
80%
5-10 mm
-
16 km/h E
1
SatApr 14
Mixed precipitation
3°C
-1
-2°
90%
25-35 mm
-
26 km/h NE
0
SunApr 15
Freezing rain
2°C
-4
2°
80%
20-30 mm
-
37 km/h NE
0
'
;with cte0 as (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(@S,char(13)+char(10),'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i) ),
cte1 as ( Select *,Grp = max(case when right(RetSeq,1)='1' then RetSeq End) over (Order by RetSeq) from cte0 ),
cte2 as ( Select *,RN = Row_Number() over (Partition By Grp Order by RetSeq) From cte1 )
Select [Date] = max(case when RN=1 then RetVal end)
,Condition = max(case when RN=2 then RetVal end)
,H3 = max(case when RN=3 then RetVal end)
,H4 = max(case when RN=4 then RetVal end)
,H5 = max(case when RN=5 then RetVal end)
,H6 = max(case when RN=6 then RetVal end)
,H7 = max(case when RN=7 then RetVal end)
,H8 = max(case when RN=8 then RetVal end)
,H9 = max(case when RN=9 then RetVal end)
,H10 = max(case when RN=10 then RetVal end)
From cte2
Group By Grp
Having max(case when RN=1 then RetVal end) is not null