使用COUNT,GROUP BY和HAVING不显示查看

时间:2015-06-29 13:06:59

标签: sql-server entity-framework sql-server-2008 group-by asp.net-mvc-5

我在我的数据库上设置了一个视图,用于跟踪活动,按日期分组和按用户计数。日期是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行,但它显示相同的行两到三次并且根本没有显示某些行。任何有助于深入了解这一点的人都会非常感激。

1 个答案:

答案 0 :(得分:0)

我知道这不是解决问题的答案,但您认为有些问题。前100%不会做你想象的那样。我假设您添加了因为您希望您的视图“已订购”,并且在视图声明中有订单但没有顶部时会收到错误消息。这里的问题是在视图中添加订单并不能保证视图的输出将按此顺序返回。事实上,它在逻辑上甚至没有意义。如果在一个查询中有两个视图并且它们都有一个相互矛盾的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