Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据SQL中固定的行数将长列拆分为多列_Sql_Sql Server - Fatal编程技术网

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

我正在学习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    |  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