sql - 错误: Cannot use an aggregate or a subquery in an expression used for the group by list

标签 sql sql-server sql-server-2008

我收到此错误:无法在用于 GROUP BY 子句的分组依据列表的表达式中使用聚合或子查询。

我在互联网上搜索,但我不知道如何在我的情况下应用更正。我只找到了不同类型的查询。

我试图在字段(第 5 行)中获取计数结果,但是当我添加计数查询时,我收到此错误。

我使用的是 SQL SERVER 2008 R2。

当我从 SELECT 和 GROUP BY 中删除计数时,查询正确运行。

SELECT TF.COD_FORNECEDOR AS 'Cód. Fornec.',
    TF.NOM_FANTASIA AS 'Fornecedor',
    DM.COD_CONTRATO_RELACIONADO AS 'CONTRATO',
    UA2.NOM_USUARIO AS 'NOM_USUARIO_COMPRADOR',
    (SELECT COUNT(COD_CONTRATO_RELACIONADO) FROM TB_DEMANDA D INNER JOIN TB_PROCESSO P ON D.COD_CONTRATO_RELACIONADO = P.NUM_CONTRATO WHERE D.COD_CONTRATO_RELACIONADO = DM.COD_CONTRATO_RELACIONADO) AS 'NUM_ADITIVO',
    0 AS 'Qtd. Aditivo',
    SUM(DM.VAL_TOTAL_ORCADO) AS 'Valor Inicial',
    SUM(TP.VAL_CONTRATADO) AS 'Valor Final',
    ((SUM(TP.VAL_CONTRATADO) / SUM(DM.VAL_TOTAL_ORCADO)) -1) * 100 AS 'Var. %'
FROM TB_FORNECEDOR TF 
    LEFT JOIN TB_DEMANDA DM ON DM.COD_FORNECEDOR = TF.COD_FORNECEDOR
    LEFT JOIN TB_PROCESSO TP ON DM.COD_DEMANDA = TP.COD_DEMANDA
    LEFT JOIN TB_PROCESSO_FORNECEDOR PF ON PF.COD_PROCESSO = TP.COD_PROCESSO
    LEFT JOIN USUARIO UA ON UA.NUM_USUARIO = DM.NUM_USUARIO_COMPRADOR
    LEFT JOIN USUARIO UA2 ON UA2.NUM_USUARIO = DM.NUM_USUARIO_COMPRADOR
    LEFT JOIN TB_STATUS_DEMANDA_DATA SD ON SD.COD_DEMANDA = DM.COD_DEMANDA
    LEFT JOIN TB_BASELINE BA ON BA.COD_PROCESSO = TP.COD_PROCESSO
    LEFT JOIN TB_BASELINE_TAREFAS BT ON BT.COD_BASELINE = BA.COD_BASELINE AND BT.COD_PROCESSO = BA.COD_PROCESSO
    LEFT JOIN TB_STATUS_PROCESSO SP ON SP.COD_STATUS = SD.COD_STATUS
    LEFT JOIN TB_MEDIO_STATUS MS ON MS.COD_MEDIO_STATUS = SP.COD_MEDIO_STATUS
    left JOIN #TB_PROCESSO TT ON TT.COD_PROCESSO = TP.COD_PROCESSO
GROUP BY 
    TF.COD_FORNECEDOR,
    TF.NOM_FANTASIA,
    DM.COD_CONTRATO_RELACIONADO,
    UA2.NOM_USUARIO,
    (SELECT COUNT(COD_CONTRATO_RELACIONADO) FROM TB_DEMANDA D INNER JOIN TB_PROCESSO P ON D.COD_CONTRATO_RELACIONADO = P.NUM_CONTRATO WHERE D.COD_CONTRATO_RELACIONADO = DM.COD_CONTRATO_RELACIONADO)
ORDER BY TF.NOM_FANTASIA 

最佳答案

试试这个:

SELECT TF.COD_FORNECEDOR AS 'Cód. Fornec.',
    TF.NOM_FANTASIA AS 'Fornecedor',
    DM.COD_CONTRATO_RELACIONADO AS 'CONTRATO',
    UA2.NOM_USUARIO AS 'NOM_USUARIO_COMPRADOR',
    sq.cnt AS 'NUM_ADITIVO',
    0 AS 'Qtd. Aditivo',
    SUM(DM.VAL_TOTAL_ORCADO) AS 'Valor Inicial',
    SUM(TP.VAL_CONTRATADO) AS 'Valor Final',
    ((SUM(TP.VAL_CONTRATADO) / SUM(DM.VAL_TOTAL_ORCADO)) -1) * 100 AS 'Var. %'
FROM TB_FORNECEDOR TF 
    LEFT JOIN TB_DEMANDA DM ON DM.COD_FORNECEDOR = TF.COD_FORNECEDOR
    LEFT JOIN TB_PROCESSO TP ON DM.COD_DEMANDA = TP.COD_DEMANDA
    LEFT JOIN TB_PROCESSO_FORNECEDOR PF ON PF.COD_PROCESSO = TP.COD_PROCESSO
    LEFT JOIN USUARIO UA ON UA.NUM_USUARIO = DM.NUM_USUARIO_COMPRADOR
    LEFT JOIN USUARIO UA2 ON UA2.NUM_USUARIO = DM.NUM_USUARIO_COMPRADOR
    LEFT JOIN TB_STATUS_DEMANDA_DATA SD ON SD.COD_DEMANDA = DM.COD_DEMANDA
    LEFT JOIN TB_BASELINE BA ON BA.COD_PROCESSO = TP.COD_PROCESSO
    LEFT JOIN TB_BASELINE_TAREFAS BT ON BT.COD_BASELINE = BA.COD_BASELINE AND BT.COD_PROCESSO = BA.COD_PROCESSO
    LEFT JOIN TB_STATUS_PROCESSO SP ON SP.COD_STATUS = SD.COD_STATUS
    LEFT JOIN TB_MEDIO_STATUS MS ON MS.COD_MEDIO_STATUS = SP.COD_MEDIO_STATUS
    LEFT JOIN #TB_PROCESSO TT ON TT.COD_PROCESSO = TP.COD_PROCESSO
    LEFT JOIN (
                SELECT D.COD_CONTRATO_RELACIONADO, COUNT(COD_CONTRATO_RELACIONADO) AS cnt 
                FROM TB_DEMANDA D 
                        INNER JOIN TB_PROCESSO P ON D.COD_CONTRATO_RELACIONADO = P.NUM_CONTRATO 
                GROUP BY D.COD_CONTRATO_RELACIONADO
            ) sq ON sq.COD_CONTRATO_RELACIONADO = DM.COD_CONTRATO_RELACIONADO
GROUP BY 
    TF.COD_FORNECEDOR,
    TF.NOM_FANTASIA,
    DM.COD_CONTRATO_RELACIONADO,
    UA2.NOM_USUARIO,
    sq.cnt
ORDER BY TF.NOM_FANTASIA 

我将 num_aditivo 子查询集成到 LEFT JOIN 中。

关于sql - 错误: Cannot use an aggregate or a subquery in an expression used for the group by list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820016/

相关文章:

mysql - 如何在 INNER JOIN 语句中使用括号

sql - 编写一个 SQL 触发器来比较旧值和新值

sql-server - 数据库中的所有表都应该相关还是可以保留其中的一些表?

sql - 在全局临时表中加载数据

mysql - 选择具有三个 where 条件的查询较慢,但具有三个 where 条件中的任意两个组合的相同查询很快

sql - 在 CASE SQL 语句中使用 BETWEEN

sql - 显示包含特定列的所有表

c# - SQL 服务器 2008 R2 : How do I "pause" a clustered index while the server is being written to?

数据库组织Oracle

sql - T-SQL SELECT TOP 返回重复项