我有一个简单的观点:
CREATE VIEW [dbo].[ApplicationSummary]
AS
SELECT
CONVERT(VARCHAR(50), NEWID()) AS ID,
ISNULL(AVG(ApplicationTime), 0) AS 'AvgApplicationTime',
ISNULL(AVG(ResponseTime), 0) AS 'AvgResponseTime',
ISNULL(CAST(1.0 * COUNT(CASE WHEN [IsAccepted] = 1 THEN 1 END) / COUNT(*) AS float), 0) AS 'PctAccepted'
FROM
[Application]
WHERE
(IsValid = 1)
AND (CreatedOn < CAST(GETDATE() AS date)
AND CreatedOn >= CAST(GETDATE()-30 AS date))
这个想法是输出3个变量。前2个是简单的“平均值”,而最后一个是“PctAccepted”输出比率。
我正在测试一个包含4行的表 - 其中3行设置为 IsAccepted = true ,因此结果为0.75(3/4),转换为75%。
我正在尝试删除对视图的需求,并使用Linq在我的Entity Framework类上复制它。
以下是查询中的重要内容:
var startDate = DateTime.Today;
var endDate = DateTime.Today.AddDays(-30);
var q = r.Find(x => x.IsValid &&
x.CreatedOn < startDate && x.CreatedOn >= endDate)
.GroupBy(x => x)
.Select(g => new
{
AvgApplicationTime = (int)g.Average(i => i.ApplicationTime),
AvgResponseTime = (int)g.Average(i => i.ResponseTime),
ApprovalRatio = g.Count(i => i.IsAccepted == true) / (double)g.Count()
}).First();
return new ApplicationStats(q.AvgApplicationTime, q.AvgResponseTime, q.ApprovalRatio);
到目前为止,我有两个平均值正确输出,但比率返回1(或100%)。
最初,我认为这可能是一个舍入问题,但我输出了这一行的结果:g.Count(i => i.IsAccepted == true)
并错误地返回1.
我可能在错误的地方进行分组,但我目前正在努力使其发挥作用。
任何帮助表示感谢。
答案 0 :(得分:1)
找到答案。
将.GroupBy(x => x)
更改为.GroupBy(x => 1)
。
同样g.Count(i => i.IsAccepted == true)
可以简化为g.Count(i => i.IsAccepted)