SqlSugar join+分组+排序取前10怎么实现? 返回
SqlSugar
沟通中
7
602
悬赏: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 VIP0
2025/9/30期望的SQL语句应该是这样
0 回复 -
fate sta VIP0
2025/9/30函数用错了
0 回复 -
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 VIP0
2025/9/30用SQL实现了
0 回复 -
LDMING VIP0
2025/9/30@fate sta:函数用错了应该值不对,SQL结构应该没变化吧
0 回复 -
fate sta VIP0
2025/9/30你上面的SQL是可以百分百ORM实现的。
0 回复 -
fate sta VIP0
2025/9/30结构不对是你用了mergetable 。不用mergetable orderby 和group by写select前面
0 回复