MySQL将一些行转换为列

MySQL将一些行转换为列,mysql,sql,pivot,birt,crosstab,Mysql,Sql,Pivot,Birt,Crosstab,我在MySQL中有这样一个表: Trans Time_In Placard Container Sztp Line Time_Out ===== ======= ======= ========= ==== ==== ======== IN 10:15 254114 CLHU12345 40DH MAE 10:54 <In transaction OUT 10:15 254114 MAEU45678 20DR SEA 10:54 <Out Tr

我在MySQL中有这样一个表:

Trans Time_In Placard Container Sztp Line Time_Out   
===== ======= ======= ========= ==== ==== ========
IN    10:15   254114  CLHU12345 40DH MAE  10:54   <In transaction
OUT   10:15   254114  MAEU45678 20DR SEA  10:54   <Out Transaction (same placard)
OUT   10:15   254114  TTNU98765 20DR CHI  10:54   <Out Transaction (same placard)

IN    11:23   664524  FSCU13479 40RH SEB  11:55   <In transaction
OUT   11:23   664524  PONU55588 40DR MAB  11:55   <Out Transaction (same placard)

IN    13:01   542234  TLHU77665 40RH MOL  13:23   <In transaction (no out)

OUT   13:36   232212  MLHU22341 20DR CMD  13:49   <Out Transaction (no in)

OUT   14:03   187852  AMFU56041 20DR CMD  14:48   <Out Transaction (no in)
OUT   14:03   187852  CCLU44112 20DR CHN  14:48   <Out Transaction, same placard (no in)
Time In Placard Cont1     Sztp1  Line1 Cont2     Sztp2 Line2 Cont3     Sztp3 Line3 Cont4     Sztp4 Line4 Time Out
======= ======= ========= =====  ===== ========= ===== ===== ========= ===== ===== ========= ===== ===== ========
10:15   254114  CLHU12345 40DH   MAE   MAEU45678 20DR  SEA   TTNU98765 20DR  CHI   null      null  null  10:54
11:23   664524  FSCU13479 40RH   SEB   PONU55588 40DR  MAB   null      null  null  null      null  null  11:55
13:01   542234  TLHU77665 40RH   MOL   null      null  null  null      null  null  null      null  null  13:23
13:36   232212  MLHU22341 20DR   CMD   null      null  null  null      null  null  null      null  null  13:49
14:03   187852  AMFU56041 20DR   CMD   CCLU44112 20DR  CHN   null      null  null  null      null  null  14:48
本表的预期用途为BIRT报告

谢谢你的帮助


顺便说一句,我已经问了一个类似的问题,但从一开始就不是很清楚,所以我向主持人报告并发布了这个问题。对此表示歉意。希望您能帮助我。

BIRT交叉表可以处理这个问题,例如,它离您想要做的事情很近:它将5个订单行转换为列

这个选项的优点是,它是完全动态的:我们不必在任何地方硬编码每个行号的字段,如Cont1、Cont2、Sztp1、Sztp2等

为了在您的上下文中实现同样的效果,您需要为每个事务设置一个行号。这样的行号可以在MySQL存储过程中计算,也可以在BIRT数据集的计算列中计算,方法是检查当前行的“Time in”和“plastic”值是否与前一行不同。当然,查询需要按“Time In”+“Placard”对事务进行排序

一旦数据集中有了行号,我们就可以设计一个包含2个组和2个度量值的数据立方体

  • 第一组:“时间在”+“标语牌”。添加子级别以在屏幕截图中的“订单”和“日期”等单独列中显示这些字段
  • 第二组:行号
  • 度量值1:字段:“容器”类型:字符串聚合函数:第一个
  • 度量值2:字段:“Sztp”类型:字符串聚合函数:FIRST

    • BIRT交叉表可以处理这个问题,例如,它离您想要做的事情很近:它将5个订单行转换为列

      这个选项的优点是,它是完全动态的:我们不必在任何地方硬编码每个行号的字段,如Cont1、Cont2、Sztp1、Sztp2等

      为了在您的上下文中实现同样的效果,您需要为每个事务设置一个行号。这样的行号可以在MySQL存储过程中计算,也可以在BIRT数据集的计算列中计算,方法是检查当前行的“Time in”和“plastic”值是否与前一行不同。当然,查询需要按“Time In”+“Placard”对事务进行排序

      一旦数据集中有了行号,我们就可以设计一个包含2个组和2个度量值的数据立方体

      • 第一组:“时间在”+“标语牌”。添加子级别以在屏幕截图中的“订单”和“日期”等单独列中显示这些字段
      • 第二组:行号
      • 度量值1:字段:“容器”类型:字符串聚合函数:第一个
      • 度量值2:字段:“Sztp”类型:字符串聚合函数:FIRST

      您可以使用子查询创建一行数据,将每个唯一的数据块作为列

      Select distinct yourdata.placard
      , yourdata.Time_In
      , yourdata.Time_Out
      , Inbound.Insztp
      , Inbound.InContainer
      
      from dbo.yourdata
      
      --Sub query gets inbound sztp and container info
      left join (select placard
                 , sztp as 'Insztp'
                 , Container as 'InContainer'
                 from dbo.yourdata
                 where trans = 'IN') as Inbound 
                     on yourdata.placard = Inbound.placard
      

      您需要加入更多的子查询来创建其他列,但这是基本思想

      您可以使用子查询创建一行数据,将每个唯一的数据块作为列

      Select distinct yourdata.placard
      , yourdata.Time_In
      , yourdata.Time_Out
      , Inbound.Insztp
      , Inbound.InContainer
      
      from dbo.yourdata
      
      --Sub query gets inbound sztp and container info
      left join (select placard
                 , sztp as 'Insztp'
                 , Container as 'InContainer'
                 from dbo.yourdata
                 where trans = 'IN') as Inbound 
                     on yourdata.placard = Inbound.placard
      

      您需要加入更多的子查询来创建其他列,但这是基本思想

      BIRT将数据透视表称为“交叉表”。仅供参考,你是说我可以一个人对付伯特?听起来很划算。我会研究的。任何指向正确方向的点都是值得赞赏的。最终报告将有多少行?如果有数千个或更多的查询,我会使用左连接子查询在SQL中执行繁重的查询。多米尼克非常了解伯特,所以你可以接受他们的答案。我学习了如何在SE上执行SQL子查询解决方案,因此您应该能够在此处找到它。如果没有,请告诉我,我将发布一些内容。查询返回的记录不超过200-300条,因为用户只查询特定的班次,无论是白班还是夜班。理想情况下,我会每小时用列中的数据更新一个表,所以我更喜欢使用MySQL方法。如果你能给我一些指导,这将非常有帮助。BIRT称数据透视表为“交叉表”。仅供参考,你是说我可以一个人对付伯特?听起来很划算。我会研究的。任何指向正确方向的点都是值得赞赏的。最终报告将有多少行?如果有数千个或更多的查询,我会使用左连接子查询在SQL中执行繁重的查询。多米尼克非常了解伯特,所以你可以接受他们的答案。我学习了如何在SE上执行SQL子查询解决方案,因此您应该能够在此处找到它。如果没有,请告诉我,我将发布一些内容。查询返回的记录不超过200-300条,因为用户只查询特定的班次,无论是白班还是夜班。理想情况下,我会每小时用列中的数据更新一个表,所以我更喜欢使用MySQL方法。如果你能给我一些指导,这将非常有帮助。BIRT称数据透视表为“交叉表”。仅供参考,你是说我可以一个人对付伯特?听起来很划算。我会研究的。任何指向正确方向的点都是值得赞赏的。最终报告将有多少行?如果有数千个或更多的查询,我会使用左连接子查询在SQL中执行繁重的查询。多米尼克非常了解伯特,所以你可以接受他们的答案。我学习了如何在SE上执行SQL子查询解决方案,因此您应该能够在此处找到它。如果没有,请告诉我,我将发布一些内容。查询返回的记录不超过200-300条,因为用户只查询特定的班次,无论是白班还是夜班。理想情况下,我会每小时用列中的数据更新一个表,所以我更喜欢使用MySQL方法。如果你能给我一些指导,那会很有帮助的。我来看看。尽管如此,我更喜欢使用列创建一个表,并将其保存到我们的数据仓库中,这样报表运行得更快。如何计算每笔交易的行号?我没有像Oracle SQL中那样的滞后或超前语句,我更熟悉这些语句。@Martin有一种计算行号的优雅方法