2012-04-18 11 views
0

私のWebシステムで、どこからでもログインできる、家族の写真、dokuments ++。私のグループ分けは正しいですか、データが欠落している気分になりました

それはやり過ぎのシステムだが、私はそれは楽しいことだと思う開発者として: DataTimeユーザーID(int型)IP(varchar型)にErrorMessage(テキスト)

:私のerrortableでD

私は次のような構造を持っています ID(int)Firstname(varchar)姓(varchar)

異なるエラーごとに数を数えたいと思っていますが、私は間違いを犯していると思います同じユーザーは複数のIPを持つことができ、1つの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上で同じ人を「離れて」グループ化している可能性があります。

答えて

3

SELECT句に人の名前とIPアドレスが含まれているため、エラーメッセージあたりのエラーカウントは、1人の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; 
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 

あなたはそれが私たちはもっとあなたを助けることができるようになりますです正確に何を指定した場合。

関連する問題