2

我收到此错误:不能在用于 GROUP BY 子句列表的 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 
4

1 回答 1

3

试试这个:

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 

我在 LEFT JOIN 中集成了 num_aditivo 子查询。

于 2013-11-06T18:47:35.243 回答