我有一个关于我试图编写的SQL查询的问题。
我需要从数据库中查询数据。除其他外,数据库有以下三个字段:
Account_ID #,Date_Created,Time_Created
我需要写一个查询,告诉我每小时打开多少个帐户。
我已经写过上述查询,但有时会创建0个帐户,因此结果中没有填充这些“小时”。
例如:
体积Date__Hour 435-03年8月12日至12日 213 12-8月-12 04 125 12-8月-12 06
如上例所示,5小时没有开设任何帐户。
是否有一种方法,结果可以填充小时,但显示为这个小时打开的0帐户?我希望我的结果看起来像这样的例子:
卷Date_Hour
435-03年8月12日至12日
213 12-8月-12 04
0 12-8月-12 05
125 12-8月-12 06
谢谢!
更新:这是我到目前为止所掌握的。
SELECT count(*) as num_apps, to_date(created_ts,'DD-Mon-RR') as app_date, to_char(created_ts,'HH24') as app_hour
FROM accounts
WHERE To_Date(created_ts,'DD-Mon-RR') >= To_Date('16-Aug-12','DD-Mon-RR')
GROUP BY To_Date(created_ts,'DD-Mon-RR'), To_Char(created_ts,'HH24')
ORDER BY app_date, app_hour发布于 2012-10-02 19:26:23
要获得所需的结果,您将需要创建一个表(或者使用一个查询生成一个"temp“表),然后在计算查询中使用左联接来获取每小时的行--即使是那些具有0卷的行。
例如,假设我有一个带有app_date和app_hour字段的表。还假设此表在您希望报告的每一天/每小时中都有一行。
查询内容如下:
SELECT NVL(c.num_apps,0) as num_apps, t.app_date, t.app_hour
FROM time_table t
LEFT OUTER JOIN
(
SELECT count(*) as num_apps, to_date(created_ts,'DD-Mon-RR') as app_date, to_char(created_ts,'HH24') as app_hour
FROM accounts
WHERE To_Date(created_ts,'DD-Mon-RR') >= To_Date('16-Aug-12','DD-Mon-RR')
GROUP BY To_Date(created_ts,'DD-Mon-RR'), To_Char(created_ts,'HH24')
ORDER BY app_date, app_hour
) c ON (t.app_date = c.app_date AND t.app_hour = c.app_hour)发布于 2012-10-02 21:39:12
我认为最好的解决方案不是创建一些花哨的临时表,而是使用以下构造:
select level
FROM Dual
CONNECT BY level <= 10
ORDER BY level;这将给你(十行):1 2 3 4 5 6 7 8 9 10
每隔几个小时,只需稍作修改:
select 0 as num_apps, (To_Date('16-09-12','DD-MM-RR') + level / 24) as created_ts
FROM dual
CONNECT BY level <= (sysdate - To_Date('16-09-12','DD-MM-RR')) * 24 ; 为了好玩,为您添加解决方案(我没有尝试语法,所以我对任何错误表示歉意,但想法很清楚):
SELECT SUM(num_apps) as num_apps, to_date(created_ts,'DD-Mon-RR') as app_date, to_char(created_ts,'HH24') as app_hour
FROM(
SELECT count(*) as num_apps, created_ts
FROM accounts
WHERE To_Date(created_ts,'DD-Mon-RR') >= To_Date('16-09-12','DD-MM-RR')
UNION ALL
select 0 as num_apps, (To_Date('16-09-12','DD-MM-RR') + level / 24) as created_ts
FROM dual
CONNECT BY level <= (sysdate - To_Date('16-09-12','DD-MM-RR')) * 24 ;
)
GROUP BY To_Date(created_ts,'DD-Mon-RR'), To_Char(created_ts,'HH24')
ORDER BY app_date, app_hour
;发布于 2012-10-02 19:29:09
您还可以在SELECT中使用CASE语句强制执行所需的值。
https://stackoverflow.com/questions/12696723
复制相似问题