MySQL将一些行转换为列
我在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
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
- 第一组:“时间在”+“标语牌”。添加子级别以在屏幕截图中的“订单”和“日期”等单独列中显示这些字段
- 第二组:行号
- 度量值1:字段:“容器”类型:字符串聚合函数:第一个
- 度量值2:字段:“Sztp”类型:字符串聚合函数:FIRST
- BIRT交叉表可以处理这个问题,例如,它离您想要做的事情很近:它将5个订单行转换为列
这个选项的优点是,它是完全动态的:我们不必在任何地方硬编码每个行号的字段,如Cont1、Cont2、Sztp1、Sztp2等
为了在您的上下文中实现同样的效果,您需要为每个事务设置一个行号。这样的行号可以在MySQL存储过程中计算,也可以在BIRT数据集的计算列中计算,方法是检查当前行的“Time in”和“plastic”值是否与前一行不同。当然,查询需要按“Time In”+“Placard”对事务进行排序
一旦数据集中有了行号,我们就可以设计一个包含2个组和2个度量值的数据立方体
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有一种计算行号的优雅方法