Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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/7/sql-server/21.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,这是我的数据 ID LotNo AlarmDateTime AlarmMessage 1 1 1/1/2014 12:00 E-Stop 2 1 1/1/2014 12:02 Safety Door Opened 3 1 1/1/2014 12:05 Robot Fault 4 3 1/2/2014 5:09 Operator Door Opened 5 3

这是我的数据

ID  LotNo       AlarmDateTime       AlarmMessage
1   1       1/1/2014 12:00      E-Stop
2   1       1/1/2014 12:02      Safety Door Opened
3   1       1/1/2014 12:05      Robot Fault
4   3       1/2/2014 5:09       Operator Door Opened
5   3       1/2/2014 6:00       Feeder Empty
6   5       1/4/2014 14:00      Feeder Jam
我想要的是:

LotNo,Alm_1_DT,Alm_1_MS,Alm_2_DT,Alm_2_ms,Alm_3_dt,Alm_3_ms
1, 1/1/2014 12:00, E-Stop, 1/1/2014 12:02, Safety Door Opened, 1/1/2014 12:05, Robot Fault
3, 1/2/2014 5:09, Operator Door Opened, 1/2/2014 6:00, Feeder Empty, NULL, NULL
5, 1/4/2014 14:00, Feeder Jam, NULL, NULL, NULL, NULL
我花了几天时间研究这个问题,我知道我可以用存储过程解决它并将其保存到表中,但这将是系统密集型的。我希望有一种方法可以使用select语句并构建视图

谢谢你抽出时间


文档。

谢谢您的建议,这提供了解决方案的第一部分,解决方案的第二部分是当我发现我可以使用分区(解决方案已找到)重置row_number()命令时,通过这两项,我能够构建一个数据集,我可以透视并获得所需的输出

select [Conveyor_ID], [1] as Alarm_1_1, [2] as Alarm_1_2, [3] as Alarm_2_1, [4] as Alarm_2_2, [5] as Alarm_3_1, 
                      [6] as Alarm_3_2, [7] as Alarm_4_1, [8] as Alarm_4_2, [9] as Alarm_5_1, [10] as Alarm_5_2
From
(
    select [Conveyor_ID], Data, row_Number() over (partition by [conveyor_ID] order by getdate() ) as IndexNum
    from (Select top 100 percent [Conveyor_ID], cast([Alarm_Message] as varchar(60)) as [Alarm_Message], cast([Alarm_datetime] as varchar(60)) as [Alarm_datetime] 
          from [Database].[dbo].[tabel]
          order by [conveyor_ID], [Report_Alarm_ID] asc) RA
    unpivot (Data for Type in ([Alarm_datetime], [Alarm_Message])) as upvt
) as TB1
pivot
(
max([data])
for [IndexNum] in ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10] )
)as Pvt2
以下是选项卡中的原始数据:

Conveyor_ID Alarm_Message   Alarm_datetime
0           PLC Loss Of Comm                                                2008-08-04 14:14:40.000
0           PLC Loss Of Comm                                                2008-08-04 13:55:54.000
0           PLC Loss Of Comm                                                2008-08-04 13:52:25.000
0           Oven Temp High Alarm                                            2008-08-04 13:10:20.000
0           E-stop Active                                                   2008-08-04 10:52:05.000
0           Oven Temp Low Alarm                                             2008-08-01 19:38:37.000
0           E-stop Active                                                   2008-08-01 10:19:01.000                                         2008-07-30 15:12:53.000
以下是添加索引字段后未插入的数据

Conveyor_ID Data                   IndexNum
0           Aug  4 2008  2:14PM    1
0           PLC Loss Of Comm       2
0           Aug  4 2008  1:55PM    3
0           PLC Loss Of Comm       4
0           Aug  4 2008  1:52PM    5
0           PLC Loss Of Comm       6
0           Aug  4 2008  1:10PM    7
0           Oven Temp High Alarm   8
0           Aug  4 2008 10:52AM    9
0           E-stop Active          10
0           Aug  1 2008  7:38PM    11
最后,结果如下:

Conveyor_ID Alarm_1_1           Alarm_1_2                 Alarm_2_1             Alarm_2_2               Alarm_3_1            Alarm_3_2                  Alarm_4_1             Alarm_4_2                Alarm_5_1            Alarm_5_2
0           Aug  4 2008  2:14PM PLC Loss Of Comm          Aug  4 2008  1:55PM   PLC Loss Of Comm        Aug  4 2008  1:52PM  PLC Loss Of Comm           Aug  4 2008  1:10PM   Oven Temp High Alarm     Aug  4 2008 10:52AM  E-stop Active                                               
1           Jan  3 2009  6:58AM Low Bearing Air Fault     NULL                  NULL                    NULL                 NULL                       NULL                  NULL                     NULL                 NULL
再一次,我要感谢第十二位,感谢他迅速做出反应,并帮助我找到解决方案的第一部分。我没有试图以任何方式优化它,任何建议或改进都是非常受欢迎的


医生

每个lotNo的行数有上限吗?没有,没有限制,因为系统可以生成大量警报,但我只对在日期前显示前5名感兴趣。您要查找的术语是pivot(在本例中为unpivot)…这是将许多行转换为列的行为,反之亦然。您将从前5个组件获得一个有趣的实现,但理论是一样的。我现在没有时间给你定制一个代码响应…如果你自己还没有弄明白的话,也许明天吧。我一直在玩unpivot,虽然这看起来给了我一些我可以使用的东西,但我还没有弄明白如何将结果数据转换成我需要的格式,我想我需要一个有一个计数的列,1-2-3-4等。与未插入的数据中的每一行相关,在新批次上重置,然后我可以使用它将数据转换为我想要的格式。