【问题标题】:View with COUNT, GROUP BY and HAVING not displaying [duplicate]使用 COUNT、GROUP BY 和 HAVING 不显示 [重复]
【发布时间】:2015-09-15 23:13:58
【问题描述】:

我在我的数据库上设置了一个视图来跟踪活动、按日期分组并按用户计数。日期是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% 确定这 22 行显示的数据是重复的?
  • 您可以将您的日期时间列转换为日期。将是更简单的代码。我不太明白问题出在哪里或是什么。是sql视图还是mvc视图的问题?
  • @SeanLange:尝试强制转换为日期,但出现了无法处理日期方法的错误。 SQL 视图中的数据很好,所以我认为问题一定出在 MVC 端。
  • @DavidG:是的,SQL 视图在每个日期每个用户都有一行,正如您所期望的那样。 MVC 视图以看似随机的顺序在同一日期多次显示同一用户。数据按日期排序,因此日期应该连续运行,但它们会来回切换。

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


【解决方案1】:

我知道这不是解决您问题的答案,但您认为有一些问题。前 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 

【讨论】:

  • 我没有添加 TOP(100)PERCENT,系统在我添加选择列时自行完成了。您的 select 语句给了我一个 SQL 执行错误:无法在日期调用方法。
  • 啊,您一定是使用 GUI 来“创建新视图”。我从不使用该工具,因为我可以比使用可视化工具更快地手动创建查询。我很好奇你得到的信息是什么。您所说的消息看起来不像是 sql server 错误消息。
  • 实际上这是视图设计器的 SSMS 中的一个错误。难怪我想不通。如果你用 sql 而不是设计器编写视图,这个问题就会消失。
  • 感谢您的帮助,肖恩。 SO 现在已将我的问题标记为重复,并指出了一个答案,其中 EF 使用的视图的密钥不是唯一的。我强迫它使用复合键,这似乎已经为我解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2021-01-28
  • 1970-01-01
  • 2019-07-07
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多