Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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/9/loops/2.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
如何在PLSQL中动态选择字段(循环)?_Sql_Loops_Plsql_Sequence - Fatal编程技术网

如何在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列的表,其中一列表

我正在工作,需要按小时计算具体值。假设班次为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列的表,其中一列表示轮班时间,其他每列合计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。范围是在当前_行和遵循正确语法之间还是伪语法之间?你做什么?我希望我说得更清楚。非常感谢你!我非常感谢。顺便说一句,你的书评不错!谢谢你的回复,我将在周三试一试。有人吗?我在戈登的回答下写了一些评论