SQL 汇总和平均

标签 sql sql-server stored-procedures average sqlgeography

我对 SQL Server、.NET 和 MVC 3/4 还很陌生,所以请耐心等待。我在 Linq-to-SQL 中创建了一个查询,它返回了我需要的数据,但不幸的是我的主机提供商不支持 DbGeography 类,特别是 DbGeography.PointFromText 方法Description here

因此,我创建了一个存储过程,并且第一部分工作正常,但我很难对数据进行汇总和平均。我想返回 SELECT 语句中按 Dish.DishId、Rest.RerstaurantId 分组的所有数据,并将 rev.Rating 转换为 AVG(rev.Rating) 并为每个组添加计数列。

以下是可以运行但不受支持的代码:

public static DbGeography CreatePoint(double latitude, double longitude)
{
     var text = string.Format(CultureInfo.InvariantCulture.NumberFormat,
                                     "POINT({0} {1})", longitude, latitude);
     return DbGeography.PointFromText(text, 4326);
 }
 public static double MilesToMeters(double? miles)
 {
     if (miles == null)
         return 0;
     return miles.Value * 1609.344;
}

[HttpGet]
public JsonResult TopRated(double lat, double lng, double miles)
{
     var source = CreatePoint(lat,lng);
     var dist = MilesToMeters(miles);
     var reviews = (from r in db.Reviews
                     where r.Restaurant.Location.Distance(source) <= dist
                     group r by new { 
                                      r.Dish,
                                      r.Restaurant.Name,
                                      r.Restaurant.Lat,
                                      r.Restaurant.Lng
                                     } into rg
                     select new { 
                                  Rating = rg.Average(r => r.Rating),
                                  Count = rg.Count(),
                                  Dish = rg.Key.Dish,
                                  Restaurant = new { 
                                                     Name = rg.Key.Name,
                                                     Lat = rg.Key.Lat,
                                                     Lng = rg.Key.Lng 
                                                   } 
                                 });                             

     reviews = reviews.OrderByDescending(r => r.Rating);
     return Json(reviews, JsonRequestBehavior.AllowGet);
 }

这里是需要修改的存储过程

CREATE PROCEDURE [dbo].[SearchNearbyReview] 
@Lat decimal(9,6),
@Lng decimal(9,6),
@Dist decimal(9,6)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @pos geography;
    SET @pos = geography::STPointFromText('POINT(' 
                                          + CONVERT(varchar(15), @Lng) + ' ' 
                                          + CONVERT(varchar(15), @Lat) + ')', 
                                          4326)

    SELECT 
        rev.Rating, 
        rest.RestaurantId, 
        rest.Name AS RestaurantName, 
        rest.[Address], 
        rest.City, 
        rest.[State], 
        rest.Zip, 
        rest.Lat, 
        rest.Lng, 
        dish.DishId, 
        dish.Name AS DishName
    FROM  dbo.Reviews rev 
    INNER JOIN dbo.Restaurants rest 
        ON rev.Restaurant_RestaurantId = rest.RestaurantId
    INNER JOIN dbo.Dishes dish 
        ON rev.Dish_DishId = dish.DishId
    WHERE rest.Location.STDistance(@pos) <= (@Dist * 1609.334)
    ORDER BY rest.RestaurantId, dish.DishId
END

最佳答案

select 
    t.AvgRating,
    t.Count,
    t.DishName,
    t.DishId,
    rest.RestaurantId,
    rest.Name AS RestaurantName,
    rest.[Address],
    rest.City,
    rest.[State],
    rest.Zip,
    rest.Lat,
    rest.Lng
from dbo.Restaurants rest 
join (select 
        avg(rev.Rating) as AvgRating,
        count(1) as Count,
        Restaurant_RestaurantId,
        min(dish.Name) AS DishName,
        DishId
      from dbo.Dishes dish 
      join dbo.Reviews rev on rev.Dish_DishId = dish.DishId 
      group by Restaurant_RestaurantId, DishId
    ) as t
on t.Restaurant_RestaurantId = rest.RestaurantId
WHERE rest.Location.STDistance(@pos) <= (@Dist * 1609.334)
ORDER BY rest.RestaurantId, t.DishId

关于SQL 汇总和平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418592/

相关文章:

sql - 为每一行分配默认值的简单连接表(包括 sql fiddle)

java - 如何在 hibernate 中以特定顺序创建表列?

sql-server - 从 SQL Server 存储过程调用 API

.net - 黑名单送货地址逻辑

sql - 正则表达式来确定合法的 SQL?

sql - 优化更新查询

没有 native 应用程序的 C# SQL Server 数据库连接

php - 如何在过程内部查询中使用过程参数变量

mysql - 优化存储过程以将 250k 记录更新为 1.7m 记录表中的随机记录?

java - Jooq 按日/月/年比较时间戳