繁体   English   中英

SQL根据日期范围用0填充空查询

[英]SQL Fill empty query with 0 based on date range

我有以下Oracle SQL查询结果:

TDATE OPEN Closed 19/05/15 1 1 20/05/15 0 1 26/05/15 2 0 27/05/15 1 0 28/05/15 2 0

例如,我想查询5月19日至30日。

我想得到的结果是:

TDATE OPEN Closed 19/05/15 1 1 20/05/15 0 1 21/05/15 0 0 22/05/15 0 0 23/05/15 0 0 24/05/15 0 0 25/05/15 0 0 26/05/15 2 0 27/05/15 1 0 28/05/15 2 0 29/05/15 0 0 30/05/15 0 0

查询在日期范围内并且不存在的记录将分别返回0和0(对于打开和关闭)。

任何帮助,将不胜感激。

可以将带有零和所有日期的空表设置为

INSERT INTO empytable
(SELECT TRUNC(@firstdat + (ROWNUM - 1)) dat, 0, 0
FROM DUAL CONNECT BY ROWNUM <= @days)

然后,您可以将结果加载到此表中,或者以其他方式将它们合并。 占位符firstdat应该是添加工作的日期。

在Oracle中,使用CTE,

WITH table_ (TDATE, OPEN, Closed) AS (
SELECT to_date('19/05/15', 'dd/mm/yy'), 1, 1 from dual UNION ALL
SELECT to_date('20/05/15', 'dd/mm/yy'), 0, 1 from dual UNION ALL
SELECT to_date('26/05/15', 'dd/mm/yy'), 2, 0 from dual UNION ALL
SELECT to_date('27/05/15', 'dd/mm/yy'), 1, 0 from dual UNION ALL
SELECT to_date('28/05/15', 'dd/mm/yy'), 2, 0 from dual),
--------------
-- End of data preparation
--------------
arr_table as (
select to_date('19/05/15', 'dd/mm/yy') + level - 1 dummy_date
  from dual 
connect by ROWNUM < = to_date('28/05/15', 'dd/mm/yy') - to_date('19/05/15', 'dd/mm/yy') + 1)
SELECT a.dummy_date, COALESCE( b.open, 0) AS OPEN,  COALESCE( b.closed, 0) AS closed
  FROM arr_table a
  LEFT OUTER JOIN table_ b
    ON b.tdate = a.dummy_date
ORDER BY  a.dummy_date;

输出:

|            DUMMY_DATE | OPEN | CLOSED |
|-----------------------|------|--------|
| May, 19 2015 00:00:00 |    1 |      1 |
| May, 20 2015 00:00:00 |    0 |      1 |
| May, 21 2015 00:00:00 |    0 |      0 |
| May, 22 2015 00:00:00 |    0 |      0 |
| May, 23 2015 00:00:00 |    0 |      0 |
| May, 24 2015 00:00:00 |    0 |      0 |
| May, 25 2015 00:00:00 |    0 |      0 |
| May, 26 2015 00:00:00 |    2 |      0 |
| May, 27 2015 00:00:00 |    1 |      0 |
| May, 28 2015 00:00:00 |    2 |      0 |

所以基本上,查询将是:

with arr_table as (
    select to_date(<start_date>, 'dd/mm/yy') + level - 1 dummy_date
      from dual 
    connect by ROWNUM < = to_date(<end_date>, 'dd/mm/yy') - to_date(<start_date>, 'dd/mm/yy') + 1)
    SELECT a.dummy_date, COALESCE( b.open, 0) AS OPEN,  COALESCE( b.closed, 0) AS closed
      FROM arr_table a
      LEFT OUTER JOIN <your_table> b
        ON b.tdate = a.dummy_date
    ORDER BY  a.dummy_date;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM