首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询帮助(高级-为我!)

SQL查询帮助(高级-为我!)
EN

Stack Overflow用户
提问于 2012-10-02 19:12:37
回答 5查看 153关注 0票数 3

我有一个关于我试图编写的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

谢谢!

更新:这是我到目前为止所掌握的。

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-02 19:26:23

要获得所需的结果,您将需要创建一个表(或者使用一个查询生成一个"temp“表),然后在计算查询中使用左联接来获取每小时的行--即使是那些具有0卷的行。

例如,假设我有一个带有app_date和app_hour字段的表。还假设此表在您希望报告的每一天/每小时中都有一行。

查询内容如下:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2012-10-02 21:39:12

我认为最好的解决方案不是创建一些花哨的临时表,而是使用以下构造:

代码语言:javascript
复制
select level
FROM Dual
CONNECT BY level <= 10
ORDER BY level;

这将给你(十行):1 2 3 4 5 6 7 8 9 10

每隔几个小时,只需稍作修改:

代码语言:javascript
复制
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 ;  

为了好玩,为您添加解决方案(我没有尝试语法,所以我对任何错误表示歉意,但想法很清楚):

代码语言:javascript
复制
 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
;
票数 1
EN

Stack Overflow用户

发布于 2012-10-02 19:29:09

您还可以在SELECT中使用CASE语句强制执行所需的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12696723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档