我有一个现有的查询,它将我的数据库60天前的成员库(sysdate-60)返回到一行,如下所示:
date - - - - members
sysdate-60 200.000
我想在一个查询中合并这个查询的多个查询的结果,以获得这样的结果:
date - - - - members
sysdate-60 200.000
sysdate-59 210.000
sysdate-58 220.000
我可以通过手动编辑每个查询的日期并使用“UNION ALL”来完成,但这很烦人。我正在寻找更好的解决方案。
我偶然发现了“递归查询”并认为这可以解决我的问题,但我无法根据自己的需要对其进行自定义。你能吗?
期待你的答案。
编辑:
让我们假设这是我使用的查询,并且没有其他方法可以检索成员数量:<
SELECT sysdate-60 AS date, count(*) AS members FROM members WHERE start_date<sysdate-60 AND end_date>=sysdate-60
答案 0 :(得分:1)
您可以使用以下查询生成1到60之间的数字:
select level from dual connect by level <= 60;
然后将其加入现有查询,例如
select 'sysdate('|| d|| ')'
, sum( case round(sysdate - created) when d then 1 else 0 end)
from
user_objects
, ( select level d from dual connect by level <= 60)
group by d
order by 1
;
或
SELECT sysdate - d, count(*)
FROM members
, ( select level d from dual connect by level <= 60)
WHERE start_date<sysdate-d
AND end_date>=sysdate-d
group by d
;
答案 1 :(得分:0)
你不需要递归;你只需要一个柜台。
此查询将为您提供过去60天的列表,以当前日期结束:
SELECT TRUNC(SYSDATE) - LEVEL + 1 AS TheDate
FROM DUAL
CONNECT BY LEVEL <= 60
如果列表应以昨天的日期结束,只需从示例中删除+ 1
。
然后,您可以将其加入主查询中,您就可以摆脱所有UNION
次查询。