使用group by的SQL查询输出

时间:2012-12-27 19:53:50

标签: sql oracle group-by

我在Oracle数据库中有这个视图,我正在尝试生成一个带有SQL查询的报告,但它现在最近几天没有工作,所以决定获得专家建议。

View确实运行良好。基本上,视图的作用是记录所有登录任何数据库以进行审计的用户。

查看列:

  • DBNAME
  • 用户名
  • 服务器
  • 程序
  • LOGON_TIME

问题:

  1. 我正在尝试按日期= 2012年12月26日登录dbname = x的所有用户名和程序生成SQL进行分组

  2. 统计用户在2012年12月26日登录的用户名和程序

  3. 基本上试图得到......如果dbname = x通过username = abc获得50000登录,那么abc是从哪个服务器和什么程序连接的?

    尝试以下查询

      select dbname, username, server, program, logon_time from audit 
        where username = abc and 
        dbname in (select dbname from audit
           where dbname='x' and logon_time = to_date('26-DEC-2012','DD-MON-YYY')) 
             group by username, program
    

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

SELECT dbname, username, server, program, trunc(logon_time), count(*) FROM audit 
WHERE username = 'abc'
AND dbname = 'x' 
AND logon_time >= to_date('26-DEC-2012','DD-MON-YYY')
AND logon_time < to_date('27-DEC-2012','DD-MON-YYY')
GROUP BY dbname, username, server, program, trunc(logon_time)

编辑:修正了修复分组错误的答案康拉德指出 仍然不是100%确定需要什么,但这应该更接近。

答案 1 :(得分:0)

这似乎非常简单,除了reformatting the date+time information只涉及日期信息的问题。

查询1:

SELECT username, program
  FROM Audit
 WHERE dbname = 'x'
   AND TO_CHAR(logon_time, 'YYYY-MM-DD') = '2012-12-26'
 GROUP BY username, program;

这应该会为您提供2012年12月26日登录到数据库'x'的不同用户名和程序组合的列表。

查询2:

除了关于数据库名称的标准外,您需要查询1中行的COUNT,因此:

SELECT COUNT(*)
  FROM (SELECT username, program
          FROM Audit
         WHERE TO_CHAR(logon_time, 'YYYY-MM-DD') = '2012-12-26'
         GROUP BY username, program
       )

这应该为您提供2012年12月26日连接到任何数据库的不同用户名,程序组合的计数。