ASP.NET WebForm(VB.NET+SQL)中GridView仅按LPR_NO分组的问题
解决方案:仅按LPR_NO分组的SQL实现
首先明确:SQL标准(以及多数数据库的默认配置)要求,SELECT语句中未使用聚合函数的字段必须全部包含在GROUP BY子句中,这就是你报错的原因。要实现仅按LPR_NO分组,需根据你对其他字段的展示需求选择以下方案:
方案1:取每个LPR_NO的第一条记录(适合只需展示单条样本的场景)
使用窗口函数ROW_NUMBER()为每个LPR_NO分组内的记录编号,筛选出编号为1的记录,无需将所有字段加入GROUP BY:
WITH RankedION AS ( SELECT LP_ION.Originator, LP_ION.Originator_ID, LPR_No, Product, LP_ION.AU, LP_ION.Qty_Req, LP_ION.Qty_Issue, LP_ION.Qty_NA, LP_ION.Status AS ION_Status, -- 按LPR_NO分区,可按需调整排序规则(示例用Originator_ID排序) ROW_NUMBER() OVER (PARTITION BY LPR_No ORDER BY LP_ION.Originator_ID) AS RowNum FROM LP_ION ) SELECT Originator, Originator_ID, LPR_No, Product, AU, Qty_Req, Qty_Issue, Qty_NA, ION_Status FROM RankedION WHERE RowNum = 1;
注:ORDER BY子句可根据业务需求修改,比如按记录创建时间排序,确保取到你需要的那条数据。
方案2:对其他字段进行聚合(适合需要统计/合并数据的场景)
如果需要对数值字段求和、文本字段合并,使用聚合函数处理非分组字段:
SELECT LPR_No, -- 用MAX()取任意一个Originator值,或按需选择其他聚合逻辑 MAX(LP_ION.Originator) AS Originator, MAX(LP_ION.Originator_ID) AS Originator_ID, -- 合并Product为逗号分隔字符串(SQL Server 2017+支持STRING_AGG) STRING_AGG(Product, ', ') AS Products, MAX(LP_ION.AU) AS AU, SUM(LP_ION.Qty_Req) AS Total_Qty_Req, SUM(LP_ION.Qty_Issue) AS Total_Qty_Issue, SUM(LP_ION.Qty_NA) AS Total_Qty_NA, MAX(LP_ION.Status) AS ION_Status FROM LP_ION GROUP BY LPR_NO;
根据业务需求选择聚合函数:数值型字段用SUM()/AVG(),文本型用STRING_AGG()/MAX()等。
方案3:关闭严格分组校验(不推荐)
如果使用SQL Server,可临时关闭ONLY_FULL_GROUP_BY配置,但这种方式会返回不确定的结果(数据库随机选择非分组字段的值),仅适合临时测试:
SET ANSI_WARNINGS OFF; SET NOCOUNT ON; SELECT LP_ION.Originator, LP_ION.Originator_ID, LPR_No, Product, LP_ION.AU, LP_ION.Qty_Req, LP_ION.Qty_Issue, LP_ION.Qty_NA, LP_ION.Status AS ION_Status FROM LP_ION GROUP BY LPR_NO;
强烈不推荐在生产环境使用,返回的非分组字段值不可控。
将上述查询的结果集直接绑定到GridView即可,无需额外修改控件的分组配置。
内容的提问来源于stack exchange,提问作者Baiju
相关产品推荐
相关产品推荐

