如何修改SQL查询,使NumGraficos显示Referencia的去重总数?
解决SQL查询中NumGraficos显示去重Referencia总数的问题
看起来你需要把NumGraficos列改成显示整个结果集中去重后的Referencia总数,我来帮你调整SQL并解释原因:
原查询的问题分析
你原来的查询里,GROUP BY子句包含了hrg.idRegisto(这应该是hRegGeometrias表的唯一行标识)以及hrg.x1、hrg.x2、hrg.x3、hrg.x4这些可能每行都不同的字段,这会导致每个分组只能包含一行数据。所以COUNT(hg.Referencia)返回的自然是1,因为每个分组里只有一个Referencia值。
方案一:使用窗口函数直接计算全局总数
最简单的方式是用窗口函数COUNT(DISTINCT ...) OVER (),它会计算整个查询结果范围内去重后的Referencia总数,并把这个值附加到每一行:
SELECT hg.referencia AS Referencia, hg.toleInf AS Min, hg.toleSup AS Max, ROUND(CAST((hrg.x1+hrg.x2+hrg.x3+hrg.x4)/4 AS FLOAT),2) AS X, COUNT(DISTINCT hg.referencia) OVER () AS NumGraficos FROM hRegGeometrias hrg JOIN hGeometria hg ON hrg.idGeometria = hg.idGeom WHERE hrg.idMatriz = 2 GROUP BY hg.referencia, hg.toleInf, hg.toleSup, hrg.x1, hrg.x2, hrg.x3, hrg.x4, hrg.idRegisto ORDER BY Referencia, hrg.idRegisto ASC
这样无论你的分组如何,每一行的NumGraficos都会显示整个结果集里去重后的Referencia总数(也就是你期望的2)。
方案二:拆分查询应对关联混乱
如果因为表关联关系复杂导致窗口函数无法正常工作,你可以拆分查询,先计算总数再关联到原结果:
WITH RefCount AS ( -- 先计算符合条件的去重Referencia总数 SELECT COUNT(DISTINCT hg.referencia) AS TotalRefs FROM hRegGeometrias hrg JOIN hGeometria hg ON hrg.idGeometria = hg.idGeom WHERE hrg.idMatriz = 2 ) SELECT hg.referencia AS Referencia, hg.toleInf AS Min, hg.toleSup AS Max, ROUND(CAST((hrg.x1+hrg.x2+hrg.x3+hrg.x4)/4 AS FLOAT),2) AS X, rc.TotalRefs AS NumGraficos FROM hRegGeometrias hrg JOIN hGeometria hg ON hrg.idGeometria = hg.idGeom -- 把总数表和原结果做交叉关联,每行都带上总数 CROSS JOIN RefCount rc WHERE hrg.idMatriz = 2 GROUP BY hg.referencia, hg.toleInf, hg.toleSup, hrg.x1, hrg.x2, hrg.x3, hrg.x4, hrg.idRegisto, rc.TotalRefs ORDER BY Referencia, hrg.idRegisto ASC
这个方法通过CTE先单独计算出总数,再通过CROSS JOIN把总数附加到每一行,避免了复杂关联带来的问题。
内容的提问来源于stack exchange,提问作者Jackal
相关产品推荐
相关产品推荐

