按名称进行麻烦分组

时间:2018-10-23 15:32:12

标签: sql sql-server

在此查询中,按名称(CC.Nome)分组时遇到麻烦,您能帮帮我吗?

这是我的代码:

SELECT  
    Registadas.CodigoVisualizado As Codigo, 
    CC.Nome as Entidade, 
    CC.Documento AS Documento, 
    CC.DataDocumento as DataDocumento, 
    ISNULL(ROUND((SELECT SUM(CASE 
                                WHEN tbCCEntidades.Natureza = 'R'
                                THEN  tbCCEntidades.TotalMoedaReferencia
                                ELSE -tbCCEntidades.TotalMoedaReferencia
                              END)
                  FROM tbCCEntidades
                  WHERE CC.IDEntidade = Entidades.ID), 2), 0) AS Saldo, 
    CC.Natureza As Natureza
FROM
    tbCCEntidades AS CC
INNER JOIN
    tbEntidades Entidades ON Entidades.ID = CC.IDEntidade
INNER JOIN
    tbEntidadesRegistadas Registadas ON Registadas.IDEntidade = Entidades.ID

发生的情况是此查询给出了这样混合的行:

Table problem here

3 个答案:

答案 0 :(得分:1)

查询的真正问题是您没有正确关联子查询:

    ISNULL(ROUND((
        SELECT SUM( CASE 
                        WHEN tbCCEntidades.Natureza = 'R'
                        THEN tbCCEntidades.TotalMoedaReferencia
                        ELSE - tbCCEntidades.TotalMoedaReferencia
                    END)
        FROM tbCCEntidades
        Where CC.IDEntidade = Entidades.ID ), 2), 0) AS Saldo, 

在此FROM子句中,您没有为表指定别名,因此在WHERE子句中,过滤器的两面都没有过滤子查询。 CCEntidades都在外部查询中,因此根本不过滤该子查询:每次都获取整个表中所有行的SUM。

仅凭此损坏的代码我无法确定修复程序。我猜想不是CC的别名,而是需要在子查询中对表进行别名,并在过滤器的左侧使用该别名。

由于子查询仅返回SUM(),因此根本不需要GROUP BY,并且由于它在子查询中,因此无法通过在主查询中添加GROUP BY来改进SUM()。

答案 1 :(得分:0)

您必须在出现条件后立即按组放

喜欢

select CC.Name,SUM(something) from TableName where SomeCondition group by CC.Name

是的,您必须将不是聚合函数的所有内容都放到group by上,我建议您继续使用CTE表达式。然后对表中需要的其他字段进行联接。

答案 2 :(得分:0)

  

查询有效,它返回我需要的数据,我不知道的是将“ Group By”放在哪里,以便按CC.Nome排序结果:/

您只想对结果行进行排序?那不是GROUP BY,而是ORDER BY

...
ORDER BY Entidade;