我的分组是正确的,得到了​​我缺少数据的感觉

时间:2012-04-18 09:33:10

标签: sql oracle

我在我的网络系统中记录错误,人们可以从任何地方登录,例如下载我分享的内容;家庭照片,dokuments ++。

这是一个矫枉过正的系统,但作为一名开发人员,我认为这很有趣:D

在我的错误中,我有以下结构: DataTime Userid(int)IP(varchar)ErrorMessage(文本)

在我的个人表中,我有以下结构: Id(int)名字(varchar)姓氏(varchar)

我想根据不同的错误计算数量或错误...但我认为我犯了一个错误,因为同一个用户可以拥有多个IP,而一个IP可以拥有多个用户。 SQL如下:

SELECT TO_CHAR(DateTime, 'DD') DAY, 
       TO_CHAR(DateTime, 'MM') MONTH, 
       log.ErrorMessage, 
       CONCAT(CONCAT(person.lastname, ', '), person.firstname), 
       log.IP, 
       count(*) AS "COUNT"
  FROM errorlog log
  FULL JOIN person person
    ON log.Userid = person.Id
 WHERE log.DateTime BETWEEN foo 
                        AND foo2
 GROUP BY TO_CHAR(DateTime, 'MM'), 
          TO_CHAR(DateTime, 'DD'), 
          person.Lastname, 
          person.Firstname, 
          log.IP, 
          log.errormessage
ORDER BY MONTH ASC, 
         DAY ASC;

我认为我的sql可能会在不同的IP上“远离”同一个人。

2 个答案:

答案 0 :(得分:3)

由于您在SELECT子句中包含了人名和IP地址,因此每个人每个IP地址的每个错误消息将返回错误计数。

如果您只想要每个日期的每条错误消息的错误计数,那么请忽略查询中的人名和IP地址:

SELECT TO_CHAR(DateTime, 'DD') DAY,
       TO_CHAR(DateTime, 'MM') MONTH,
       log.ErrorMessage,
       count(*) AS "COUNT"
  FROM errorlog log
  WHERE log.DateTime BETWEEN foo
                         AND foo2
  GROUP BY TO_CHAR(DateTime, 'MM'),
           TO_CHAR(DateTime, 'DD'),
           log.IP,
           log.errormessage
ORDER BY MONTH ASC,
         DAY ASC;

答案 1 :(得分:0)

您的查询不会计算错误。它将在同一天为同一IP地址和用户提供相同的错误消息计数。如果你想要一个用户列表和他们的错误计数,这就是SQL(未经测试):

SELECT CONCAT(CONCAT(person.lastname, ', '),  person.firstname), 
log.IP, ISNULL(count(log.DateTime), 0) AS "COUNT"  
FROM person
LEFT OUTER JOIN errorlog log
ON person.Id = log.Userid
WHERE log.DateTime BETWEEN foo AND foo2  
GROUP BY person.Lastname, person.Firstname, log.IP
ORDER BY person.Lastname, person.Firstname, log.IP

如果您准确指定它是什么,我们将能够为您提供更多帮助。