sql server-不显示COUNT、GROUP BY和HAVING的视图



我在数据库上设置了一个视图来跟踪活动,按日期分组并按每个用户计数。日期是一个DateTime列,所以我不得不将其转换为只使用日期部分。在数据库中,视图中的数据是正确的,但当视图显示在MVC5中时,它会多次显示某些数据。

为视图选择查询:

SELECT TOP(100)PERCENT DATEADD(dd, DATEDIFF(dd, 0, DateCompleted),0) AS WorkDate, UserName, Count(UserName) AS Total
FROM dbo.Queue
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, DateCompleted),0), UserName, Status
HAVING (Status = N'Completed')
ORDER BY WorkDate

在MVC控制器中:

public ActionResult Activity()
{
    IQueryable<Activity> activity = db.Activity.OrderBy(a => a.WorkDate).ThenBy(a => a.UserName);
    return View(activity);
}

视图中:

@model IEnumerable<Models.Activity>
<table class="table">
  <tr>
    <th>
        @Html.DisplayNameFor(model => model.WorkDate)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.UserName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Total)
    </th>
  </tr>
@foreach (var item in Model) {
  <tr>
    <td>
        @Html.DisplayFor(modelItem => item.WorkDate)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.UserName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Total)
    </td>
  </tr>
}
</table>

奇怪的是,数据库的结果集中有22行,视图也显示了22行,但它显示了两三次相同的行,而根本没有显示其中的一些行。如有任何帮助,我们将不胜感激。

我知道这不是解决问题的答案,但您的观点中存在一些问题。排名前100%的人不会做你认为会做的事。我假设您添加了这一点,因为您希望视图"有序",并且当视图声明中有order by但没有top时,您会收到一条错误消息。这里的问题是,在视图中添加order by并不能保证视图的输出将按该顺序返回。事实上,这在逻辑上甚至没有意义。如果在一个查询中有两个视图,并且它们都有一个相互矛盾的order by子句,该怎么办?哪一个获胜?确保查询结果顺序的唯一方法是在select语句上使用order by,而不是在基础视图上。

SELECT --TOP(100)PERCENT 
    CAST(DateCompleted as Date) AS WorkDate
    , UserName
    , Count(UserName) AS Total
FROM dbo.Queue
WHERE Status = 'Completed'
GROUP BY CAST(DateCompleted as Date), UserName
--ORDER BY WorkDate 

最新更新