SqlSugar join+分组+排序取前10怎么实现? 返回

SqlSugar 沟通中
7 602
该叫什么 LDMING 发布于2025/9/30
悬赏:0 飞吻

环境:SQL Server2016

版本:SqlSugar5.14


查询语句如下,报错:Alarm 和 RiskScore 找不到,换了几种方式都这个提示。   求正确的写法应该是什么?

原始需求为: 以 gongwu_DrivingCounts (驾驶行程统计)为主表,join gongwu_DrivingRiskSingleScores(驾驶行程风险评分) ,这两张表存储的都是每个驾驶行程的数据,获取统计风险排名,和报警次数排名前10的数据。


var sTime = DateTime.Now.Date.AddDays(-7);
using var db = SqlSugarContext.NewSqlSugarClient(_connString);
var list = await db.Queryable<RepDrivingCount>()
   .Where(c => driverId.Contains(c.DriverNo) &&
               c.Unit == 1 &&
               c.StartTime >= sTime)
   .LeftJoin<RepDrivingRiskSingleScore>((a, b) => a.Id == b.Id)
   .GroupBy((a,b) => a.DriverNo)             // 按证件号分组
   .Select((a,b) => new GetDriverCountDto         // 聚合投影
   {
       DriverNo = a.DriverNo,                       // 证件号
       StartDate = SqlFunc.RowMin(a.StartTime),
       EndDate = SqlFunc.RowMax(a.EndTime),
       Alarm = SqlFunc.RowSum(a.AlarmCount),        // 累加报警
       Mileage = SqlFunc.RowSum(a.DrivingMileage),     // 累加里程
       RiskScore = SqlFunc.RowMax(b.TotalRiskScore),     // 风险分取最大
       RiskLevel = ""
   })
   .MergeTable()//需要加上MergeTable对Select后的对象进行排序
   .OrderByIF(sort == 0, c=>c.Alarm,OrderByType.Desc)  // 次数降序 "Alarm DESC"
   .OrderByIF(sort == 1, c=>c.RiskLevel,OrderByType.Desc)  // 风险分降序 "RiskScore DESC"
   .Take(10)                             // 前 10
   .ToListAsync();



生成的SQL如下,注意注释的 --[Alarm],表 gongwu_DrivingCounts 只有 AlarmCount 字段,Alarm 是分组后多个 AlarmCount 的汇总(SUM([a].[AlarmCount]) OVER() AS [Alarm])


SELECT TOP
10 * 
FROM
(
SELECT
[a].[DriverNo] AS [DriverNo],
MIN ( [a].[StartTime] ) OVER ( ) AS [StartDate],
MAX ( [a].[EndTime] ) OVER ( ) AS [EndDate],
SUM ( [a].[AlarmCount] ) OVER ( ) AS [Alarm],
SUM ( [a].[DrivingMileage] ) OVER ( ) AS [Mileage],
MAX ( [b].[TotalRiskScore] ) OVER ( ) AS [RiskScore], '' AS [RiskLevel] 
FROM
(
SELECT
* 
FROM
(
SELECT
[Id],
[DriverNo],
[Unit],
[StartTime],
[EndTime],
[DrivingCount],
[DrivingLength],
[DrivingMileage],
[GpsDrivingMileage],
[MaxSpeed],
[AvgSpeed],
[AlarmCount],
[VehicleCount],
[VehicleIds],
[VehicleInfo]--,
--[Alarm] 
FROM
[gongwu_DrivingCounts] 
WHERE
( ( ( [DriverNo] IN ( '', '' ) ) AND ( [Unit] = 1 ) ) AND ( [StartTime] >= '2025-09-22' ) ) 
) MergeTable 
) [a]
LEFT JOIN [gongwu_DrivingRiskSingleScores] [b] ON ( [a].[Id] = [b].[Id] ) 
GROUP BY
[a].[DriverNo] 
) MergeTable 
ORDER BY
[Alarm] DESC



热忱回答7

  • LDMING LDMING VIP0
    2025/9/30

    期望的SQL语句应该是这样

    wechat_2025-09-30_104723_588.png

    0 回复
  • fate sta fate sta VIP0
    2025/9/30

    函数用错了

    0 回复
  • fate sta fate sta VIP0
    2025/9/30

    聚合函数

    SqlFunc.AggregateSum<TResult>(TResult thisValue) //求和
    SqlFunc.AggregateSumNoNull<TResult>(TResult thisValue) //求和(新 支持过滤null)
    SqlFunc.AggregateAvg<TResult>(TResult thisValue)//平均值
    SqlFunc.AggregateMin(TResult thisValue) //最小
    SqlFunc.AggregateMax<TResult>(TResult thisValue) //最大
    SqlFunc.AggregateCount<TResult>(TResult thisValue)//统计数量
    SqlFunc.AggregateDistinctCount<TResult>(TResult thisValue) //去重统计数量


    0 回复
  • LDMING LDMING VIP0
    2025/9/30

    用SQL实现了

    wechat_2025-09-30_131126_712.png

    0 回复
  • LDMING LDMING VIP0
    2025/9/30

    @fate sta:函数用错了应该值不对,SQL结构应该没变化吧

    0 回复
  • fate sta fate sta VIP0
    2025/9/30

    你上面的SQL是可以百分百ORM实现的。

    0 回复
  • fate sta fate sta VIP0
    2025/9/30

    结构不对是你用了mergetable 。不用mergetable orderby 和group by写select前面

    0 回复