SQL Server 中的 SUM 返回错误值

Wil*_*tti 2 sql sql-server sum

我在 SQL Server 2014 中的一个特定查询上遇到了一些问题。

sum 函数返回错误结果。

就我而言,我的 SQL 查询仅返回一行,其中有两个字段,例如:成本和键。

成本值为 10,密钥值为 ke890wkw。

我不知道为什么,但如果我运行类似的东西

SELECT SUM(COST) TOTAL_COST, RTRIM(KEY) 
FROM TABLE 
WHERE KEY = 'ke890wkw'
Run Code Online (Sandbox Code Playgroud)

它返回 20。

带有这个“bug”(?)的完整且真实的查询在图片sql2上

SELECT 
    SUM(CONVERT(FLOAT, DADOSREQF.compValorFrete)) vlr_total_frete,
    --CONVERT(FLOAT, DADOSREQF.compValorFrete) vlr_total_frete,
    (RTRIM(DADOSFORMF.NUMSOLICITACAO) + RTRIM(DADOSREQF.compCodFornecedor) + 
          RTRIM(DADOSREQF.compCodCondicaoPagamento) +  RTRIM(DADOSREQF.compFrete) + 
          RTRIM(DADOSREQF.compCodTransportadora)) chave
FROM
    FLUIG.DBO.ML001102 DADOSFORMF WITH(NOLOCK)
INNER JOIN 
    FLUIG.DBO.ML001105 DADOSREQF WITH(NOLOCK) ON DADOSREQF.DOCUMENTID = DADOSFORMF.DOCUMENTID 
WHERE
    (RTRIM(DADOSFORMF.NUMSOLICITACAO) + RTRIM(DADOSREQF.compCodFornecedor) + 
        RTRIM(DADOSREQF.compCodCondicaoPagamento) +  RTRIM(DADOSREQF.compFrete) + 
        RTRIM(DADOSREQF.compCodTransportadora)) = '1071002999439000103030F040' 
    AND DADOSFORMF.version = (SELECT MAX(version) 
                              FROM FLUIG.DBO.ML001105 vr 
                              WHERE vr.documentid = DADOSFORMF.documentid)
GROUP BY
    RTRIM(DADOSFORMF.NUMSOLICITACAO),
    RTRIM(DADOSREQF.compCodFornecedor),
    RTRIM(DADOSREQF.compCodCondicaoPagamento),
    RTRIM(DADOSREQF.compFrete),
    RTRIM(DADOSREQF.compCodTransportadora),
    compValorFrete
Run Code Online (Sandbox Code Playgroud)

这是带有外部总和的相同查询,它返回正确的值。

SELECT
    SUM(a.vlr_total_frete),
    a.chave 
FROM
    (SELECT 
        --SUM(CONVERT(FLOAT,    DADOSREQF.compValorFrete)) vlr_total_frete,
        CONVERT(FLOAT,  DADOSREQF.compValorFrete) vlr_total_frete,
        (RTRIM(DADOSFORMF.NUMSOLICITACAO) + RTRIM(DADOSREQF.compCodFornecedor) + RTRIM(DADOSREQF.compCodCondicaoPagamento) +  RTRIM(DADOSREQF.compFrete) + RTRIM(DADOSREQF.compCodTransportadora)) chave
    FROM
        FLUIG.DBO.ML001102 DADOSFORMF WITH(NOLOCK)
    INNER JOIN 
        FLUIG.DBO.ML001105 DADOSREQF WITH(NOLOCK) ON DADOSREQF.DOCUMENTID = DADOSFORMF.DOCUMENTID 
    WHERE
        (RTRIM(DADOSFORMF.NUMSOLICITACAO) + RTRIM(DADOSREQF.compCodFornecedor) + RTRIM(DADOSREQF.compCodCondicaoPagamento) +  RTRIM(DADOSREQF.compFrete) + RTRIM(DADOSREQF.compCodTransportadora)) = '1071002999439000103030F040' 
        AND DADOSFORMF.version = (SELECT MAX(version) 
                                  FROM FLUIG.DBO.ML001105 vr 
                                  WHERE vr.documentid = DADOSFORMF.documentid)
    GROUP BY
        RTRIM(DADOSFORMF.NUMSOLICITACAO),
        RTRIM(DADOSREQF.compCodFornecedor),
        RTRIM(DADOSREQF.compCodCondicaoPagamento),
        RTRIM(DADOSREQF.compFrete),
        RTRIM(DADOSREQF.compCodTransportadora),
        compValorFrete) a
GROUP BY 
    a.chave
Run Code Online (Sandbox Code Playgroud)

以及它在 SQL Server 2014 上运行的一些屏幕截图。

https://i.stack.imgur.com/dcGb4.png

https://i.stack.imgur.com/ww4gp.png https://i.stack.imgur.com/Sv33l.png

Aar*_*etz 5

正在发生的事情的简化示例,请考虑下表:

col1   |   col2
 A     |    10
 A     |    10
Run Code Online (Sandbox Code Playgroud)

这将返回一行:

SELECT col1, col2
FROM table
GROUP BY col1, col2

col1   |   col2
 A     |    10
Run Code Online (Sandbox Code Playgroud)

添加外部SUM将应用于该行:

SELECT SUM(col2)
FROM (SELECT col1, col2
      FROM table
      GROUP BY col1, col2) A

col1   |   col2
 A     |    10
Run Code Online (Sandbox Code Playgroud)

但是,SUM直接添加 a 将考虑两行并将值加倍:

SELECT col1, SUM(col2)
FROM table
GROUP BY col1

col1   |   col2
 A     |    20
Run Code Online (Sandbox Code Playgroud)