如何在PLSQL中动态选择字段(循环)?
我正在工作,需要按小时计算具体值。假设班次为10小时,我希望能够在PLSQL中循环并执行以下伪代码:如何在PLSQL中动态选择字段(循环)?,sql,loops,plsql,sequence,Sql,Loops,Plsql,Sequence,我正在工作,需要按小时计算具体值。假设班次为10小时,我希望能够在PLSQL中循环并执行以下伪代码: For (int i=0; i<10; i++) { SUM( DB.Sales) AS Hour#i FROM DB WHERE DB.sale_Time BETWEEN DB.Shift_Start_Time + i AND DB.Shift_Start_Time + (i+1) } 它应该返回一个包含11列的表,其中一列表
For (int i=0; i<10; i++) {
SUM( DB.Sales) AS Hour#i
FROM
DB
WHERE DB.sale_Time BETWEEN
DB.Shift_Start_Time + i AND
DB.Shift_Start_Time + (i+1)
}
它应该返回一个包含11列的表,其中一列表示轮班时间,其他每列合计10小时轮班中一小时的销售额,每个列都将以它所代表的小时命名。
基本上,我想把它用于其他目的,因为我的工作与销售无关,我的身高可以达到1000,所以我正在寻找一个通用的解决方案来解决我的问题
同样,我使用的是PLSQL
非常感谢您的帮助
谢谢您可以使用光标在每个元素上循环执行此操作。关键是按你感兴趣的时间分组
BEGIN
FOR x IN (
SELECT TRUNC( DB.sale_Time, 'HH' ) AS start_time,
SUM( db.sales ) INTO mysum
FROM db
GROUP BY TRUNC( DB.sale_Time, 'HH' )
) LOOP
/* Do loop stuff here */
END LOOP;
END;
您可以使用Oracle中的分析函数来执行此操作。首先,我按小时汇总销售数据,因为这似乎是您想要的单位,然后使用带有窗口子句的分析函数汇总小时数:
select db.shift_start_time,
sum(db.sales) over (partition by null order by db.sale_time
range between current_row and <i> following)
from (select trunc(shift_start_time*24)/24 as thehour, sum(sales) as sales
from DB
group by trunc(shift_start_time*24)/24
) db
请注意,这假设每小时都有销售。我最终放弃了我最初的要求,找到了一种简单的方法,通过以下方式循环工作时间: 挑选 db.shift\u开始时间, T1.n为小时, SUMdb.sales作为小时销售额 从…起 db, 从中选择n 通过级别0 T1从双连接中选择rownum n 哪里 db.sale_时间介于db.shift_start_时间+T1.n-1/24和db.shift_start_时间+T1.n/24之间 分组 db.shift\u开始时间, T1.n 订购人 db.shift\u开始时间, T1.n 它还解决了我的问题,即时间不是四舍五入的。如果班次在9:45开始,它将按预期工作,而不是将其调到9或10
这个解决方案唯一的问题是每小时有一行。。尽管如此,这仍然是最好的解决方案 我会在星期三尝试,如果对我有用的话会更新。谢谢你的回复。这个想法是正确的,谢谢你!但不完全是我想要的。我将试图进一步解释:1。我需要一个单独的列为每个总和。每个班次需要正好有一行。班次\开始\时间,sum1,sum2,sum3。。。。。2.轮班不一定在一整小时开始。i、 e,它可以在9:15开始,然后需要将9:15-10:15相加为SUM1,10:15-11:15相加为SUM2,等等。。。3.有点傻,买我的班次,开始时间是日期时间类型。如何转换它,使truncshift\u start\u time*24/24这样的行能够正确读取它?更多…4。范围是在当前_行和遵循正确语法之间还是伪语法之间?你做什么?我希望我说得更清楚。非常感谢你!我非常感谢。顺便说一句,你的书评不错!谢谢你的回复,我将在周三试一试。有人吗?我在戈登的回答下写了一些评论