【问题标题】:Oracle Query to sum a column by every date range in another tableOracle Query 按另一个表中的每个日期范围对一列求和
【发布时间】:2013-12-05 19:44:26
【问题描述】:

我需要在我的项目中编写一个查询,我想要在另一个表的每个日期范围(对于 ORACLE 数据库)的每个日期范围内计算一列的总和。

TABLE1 – 每个日期都有预订的人数:

DT          NO_OF_PAX
--------    ---------------
01-JAN-14    10
02-JAN-14    5
03-JAN-14    8
05-JAN-14    5
:
:
28-DEC-14    20
30-DEC-14    9
31-DEC-14    15

TABLE2 - 它有很多日期范围:

ST_DT        END_DT
---------   ------------
01-JAN-14    31-JAN-14
01-FEB-14    28-FEB-14
12-JAN-14    15-FEB-14
:
:
01-NOV-14    20-NOV-14
01-DEC-14    31-DEC-14

现在我需要编写查询,它应该为 TABLE2 的每个日期范围显示来自 TABLE1 的 SUM(NO_OF_PAX)。请教我应该怎么写。

由于两者都没有共同的列,我不知道如何加入这两个表。我写成 SELECT SUM(TABLE1.NO_OF_PAX) FROM TABLE1, TABLE2 WHERE TABLE1.DT BETWEEN TABLE2.ST_DT AND TABLE2.END_DT

它失败了,没有单组功能。

【问题讨论】:

  • 你试过什么?

标签: sql oracle


【解决方案1】:

这是正确的 SQL:

SELECT T2.ST_DT, T2.END_DT, 
(
    SELECT SUM(T1.NO_OF_PAX)
    FROM TABLE1 T1
    WHERE T1.DT BETWEEN T2.ST_DT AND T2.END_DT
) NO_OF_PAX
FROM TABLE2 T2
ORDER BY T2.ST_DT ASC

参见 SQLFiddle http://sqlfiddle.com/#!4/2e9e9/1/0

【讨论】:

    【解决方案2】:

    试试这个方法

    SELECT st_dt, end_dt, COALESCE(SUM(no_of_pax), 0) total
      FROM Table2 t2 LEFT JOIN Table1 t1
        ON t1.dt BETWEEN t2.st_dt AND end_dt
     GROUP BY st_dt, end_dt
    

    样本输出:

    | ST_DT | END_DT |总计 | |-----------|------------|--------| | 2014 年 1 月 1 日 | 14 年 1 月 31 日 | 28 | | 2014 年 1 月 12 日 | 14 年 2 月 15 日 | 0 | | 2014 年 1 月 1 日 | 14 年 2 月 28 日 | 0 | | 14 年 11 月 1 日 | 14 年 11 月 20 日 | 0 | | 14 年 12 月 1 日 | 14 年 12 月 31 日 | 44 |

    这里是SQLFiddle演示

    【讨论】:

      【解决方案3】:

      运行这个并告诉我你的结果(测试)

      SELECT A.ST_DT, A.END_DT, SUM(A.NO_OF_PAX) FROM
      (
          SELECT t2.*, t1.NO_OF_PAX
          FROM Table1 t1,
               Table2 t2
          WHERE t1.DT BETWEEN t2.ST_DT AND t2.END_DT
      ) A
      GROUP BY A.ST_DT, A.END_DT
      

      【讨论】:

      • 这会失败,你忘记了“select from”并且你正在分组,但他想知道每一行的日期范围。
      • @Andrew Paes:我使用您的 SQLFiddle 进行了测试。有效。返回与您相同的结果。
      • @Loc 道歉我忘了指定 TABLE2 可以有重复的日期范围。我仍然希望它们显示为带有人数总和的重复数据。所以这失败了,因为 GROUP BY func。
      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2018-12-29
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多