如何通过SELECT查询使表格总计为180?含Cat列等条件说明
咱们先明确下需求哈——你说的“总计值达到180”,大概率是两种场景之一:要么是从现有数据里筛选出若干行,让它们的某列总和刚好等于180;要么是不管实际数据总和是多少,让查询结果里显示的总计行固定为180。我都给你写对应的实现:
场景1:筛选行组合,让某列总和恰好为180
这属于SQL里的子集和问题,适合用递归CTE实现(支持CTE的数据库比如MySQL 8+、PostgreSQL、SQL Server都能用)。假设你的表叫data_table,有id(唯一标识行)和amount(用来求和的列):
WITH RECURSIVE subset_sums AS ( SELECT id, amount, amount AS total_sum, CAST(id AS VARCHAR(1000)) AS selected_ids FROM data_table WHERE amount <= 180 -- 先排除单个值就超过180的行 UNION ALL SELECT dt.id, dt.amount, ss.total_sum + dt.amount, CONCAT(ss.selected_ids, ',', dt.id) FROM subset_sums ss JOIN data_table dt ON dt.id > ss.id -- 避免重复选同一行,防止组合重复 WHERE ss.total_sum + dt.amount <= 180 ) SELECT selected_ids AS 选中的行ID, total_sum AS 总和 FROM subset_sums WHERE total_sum = 180;
这个查询会找出所有行的组合,它们的amount加起来刚好是180,同时返回选中的行ID列表和总和。
场景2:强制查询结果的总计行显示为180
如果是做报表需要固定显示总计为180,不管前面行的实际总和,直接用UNION ALL追加一行硬编码的总计即可:
SELECT 列1, 列2, amount AS 数值 FROM your_table -- 这里可以加其他筛选条件,比如WHERE ... UNION ALL SELECT '总计' AS 列1, '' AS 列2, 180 AS 数值;
这样查询结果的最后一行就是固定的180总计。
先理清楚表结构假设哈:你的表应该有id(真实ID,也就是主记录的ID)、mainid(子记录的ID,关联到主记录的id)、Cat(分类列),还有用来求和的数值列(比如value)。针对Cat=5的行,我分两种常见场景给出查询:
场景1:找出Cat=5的主-子记录组,总和恰好为180
如果需要统计每个主记录(Cat=5)加上它关联的所有子记录的总和,然后筛选出总和为180的组,可以用LEFT JOIN关联主、子记录后求和:
SELECT p.id AS 主记录ID, SUM(COALESCE(p.value, 0) + COALESCE(c.value, 0)) AS 组总和 FROM your_table p LEFT JOIN your_table c ON p.id = c.mainid -- 关联主记录和它的子记录 WHERE p.Cat = 5 GROUP BY p.id HAVING 组总和 = 180;
这里用COALESCE是防止主/子记录的value为NULL,确保求和不会出错。查询结果会返回所有满足“Cat=5的主记录+子记录总和为180”的主记录ID和对应总和。
场景2:强制Cat=5相关记录的总计显示为180
如果不管实际总和是多少,需要让查询结果的总计行固定为180,同样用UNION ALL追加总计行:
SELECT id, mainid, value AS 数值 FROM your_table WHERE Cat = 5 UNION ALL SELECT NULL AS id, NULL AS mainid, 180 AS 数值;
如果需要按主记录分组后再显示固定总计,写法如下:
SELECT p.id AS 主记录ID, SUM(COALESCE(p.value, 0) + COALESCE(c.value, 0)) AS 组总和 FROM your_table p LEFT JOIN your_table c ON p.id = c.mainid WHERE p.Cat = 5 GROUP BY p.id UNION ALL SELECT '总计' AS 主记录ID, 180 AS 组总和;
内容的提问来源于stack exchange,提问作者nFnK

