0

私はC#を使用したASP.NETの新しい開発者です。ある会社向けにWebベースのアプリケーションを開発しましたが、現在、システムにアクセスしている一意のユーザーの数を示すログを作成する必要があります。たとえば、部門AAの従業員AとBは、今日システムにアクセスしました。従業員Aは、同じ日に2回システムにアクセスしました。ログには、部門AAの従業員が3人ではなく、今日システムにアクセスしたことが2人いることが示されているはずです。

私は次のデータベース設計を持っています:

Employee Table: Username, Name, DivisionCode (DivisionCode is a foreign key to SapCode)
Divisions Table: SapCode DivisionShortcut   
Log Table: ID, Username, DateTimeAccessing

ユーザー名、従業員名、部門、およびDateTimeAccessingを表示する次のクエリを作成しました。

SELECT     dbo.[Log].Username, dbo.employee.Name, dbo.Divisions.DivisionShortcut, dbo.[Log].DateTimeAccessing
FROM         dbo.employee INNER JOIN
                      dbo.[Log] ON dbo.employee.Username = dbo.[Log].Username INNER JOIN
                      dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode

クエリには、次のような部門と日付に基づいて、システムに毎日アクセスした従業員の数が表示されます。

At Nove 21, Division AA = 2    
   Nove 21, Division BB = 7    
   Nove 20, Division AA = 12 and so on

それで、それをどのように行うのですか?

*更新: * 私は今次のクエリを使用しています:

SELECT     CONVERT(varchar(10), l.DateTimeAccessing, 120) AS Date, d.DivisionShortcut, COUNT(DISTINCT l.Username) AS Cnt
FROM         dbo.employee AS e INNER JOIN
                      dbo.[Log] AS l ON e.Username = l.Username RIGHT OUTER JOIN
                      dbo.Divisions AS d ON e.DivisionCode = d.SapCode
GROUP BY CONVERT(varchar(10), l.DateTimeAccessing, 120), d.DivisionShortcut

問題は、たとえば、今日またはすべての部門の11月10日の統計を表示したい場合、日付列に、その日にシステムにアクセスしている従業員がいない部門のNULL値が表示されることです。なんで?そしてそれを修正する方法は?

4

2 に答える 2

1

count(distinct)ユーザー数をカウントしgroup by、結果を部門と日付でグループ化するために使用します。

を使用convertして日時から文字列として日付を取得できますが、クエリが少し遅くなることに注意してください。

select d.DivisionShortcut, convert(varchar(10),l.DateTimeAccessing,120), count(distinct l.Username) as Cnt
from dbo.employee e
inner join dbo.[Log] l on e.Username = l.Username
inner join dbo.Divisions d on e.DivisionCode = d.SapCode
group by d.DivisionShortcut, convert(varchar(10),l.DateTimeAccessing,120)

アップデート:

日程に参加する方法は次のとおりです。

select d.DivisionShortcut, t.DateAccessing, count(distinct l.Username) as Cnt
from dbo.employee e
inner join dbo.[Log] l on e.Username = l.Username
inner join dbo.Divisions d on e.DivisionCode = d.SapCode
inner join (
  select distinct convert(varchar(10),DateTimeAccessing,120) as DateAccessing
  from dbo.Divisions
) t on t.DateAccessing = convert(varchar(10),l.DateTimeAccessing,120)
group by d.DivisionShortcut, t.DateAccessing
于 2012-11-21T08:12:02.787 に答える
1

これを試して

SELECT  cast(L.DateTimeAccessing as DATE) DateTimeAccessing
    ,D.DivisionShortcut
    ,count(distinct L.Username) as Cnt
    FROM dbo.employee E
    INNER JOIN dbo.[Log] L on E.Username = L.Username
    INNER JOIN dbo.Divisions D on E.DivisionCode = D.SapCode
    GROUP BY cast(L.DateTimeAccessing as DATE),D.DivisionShortcut
于 2012-11-21T08:44:32.373 に答える