Sql 如何显示每个部门每天访问系统的员工人数?

Sql 如何显示每个部门每天访问系统的员工人数?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我是ASP.NET的新开发人员,使用C#。我为其中一家公司开发了一个基于web的应用程序,现在我需要开发一个日志,显示访问该系统的独特用户的数量。例如,AA部门的员工A和B今天访问了该系统。员工A在同一天访问了系统两次。日志应该显示今天有两名来自AA部门的员工访问了系统,而不是三名 我有以下数据库设计: Employee Table: Username, Name, DivisionCode (DivisionCode is a foreign key to SapCode) Divisions

我是ASP.NET的新开发人员,使用C#。我为其中一家公司开发了一个基于web的应用程序,现在我需要开发一个日志,显示访问该系统的独特用户的数量。例如,AA部门的员工A和B今天访问了该系统。员工A在同一天访问了系统两次。日志应该显示今天有两名来自AA部门的员工访问了系统,而不是三名

我有以下数据库设计:

Employee Table: Username, Name, DivisionCode (DivisionCode is a foreign key to SapCode)
Divisions Table: SapCode DivisionShortcut   
Log Table: ID, Username, DateTimeAccessing
我编写了以下查询,其中显示用户名、员工姓名、部门和DateTimeAccess:

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日的统计数据,则date列将显示该部门的空值,该部门在该日期没有员工访问系统为什么?以及如何修复它?

使用
count(distinct)
统计用户数量,并使用
groupby
根据除数和日期对结果进行分组

您可以使用
convert
从datetime中获取字符串形式的日期,但请注意,这会稍微减慢查询速度

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
试试这个

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

谢谢你的帮助。我真的很感激。但是我想每天把所有的访问分组在一个分区中。例如,11月21日的访问次数为18次。您的查询显示了每个分区的访问权限only@TechnologyLover:对,我错过了。我在上面添加了日期。谢谢你的帮助,但是你能看看我更新的问题吗?因为我在日期栏中遇到了困难。谢谢,非常感谢。但是我想把所有访问按天分组到一个分区中。例如,11月21日的访问次数为18次。您的查询显示了基于时间的访问权限谢谢您的帮助。非常感激。你能看看我最新的问题吗。