SQL Server中的SUM返回错误值

时间:2018-07-19 18:59:13

标签: sql sql-server sum

SQL Server 2014中的一个特定查询遇到麻烦。

sum函数返回错误结果。

在我的情况下,我的SQL查询仅返回一行,其中包含两个字段,例如:cost和key。

成本值为10,密钥为ke890wkw。

我不知道为什么,但是如果我运行

SELECT SUM(COST) TOTAL_COST, RTRIM(KEY) 
FROM TABLE 
WHERE KEY = 'ke890wkw'

它返回20。

带有此“错误”(?)的完整和真实查询,其图片为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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

col1   |   col2
 A     |    10
 A     |    10

这将返回一行:

SELECT col1, col2
FROM table
GROUP BY col1, col2

col1   |   col2
 A     |    10

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

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

col1   |   col2
 A     |    10

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

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

col1   |   col2
 A     |    20

答案 1 :(得分:1)

如果运行此代码,您应该看到2条记录重复。之所以得到10和20个不同的结果,是因为这两个重复项。

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 
                              WHRE vr.documentid = DADOSFORMF.documentid)
GROUP BY
    RTRIM(DADOSFORMF.NUMSOLICITACAO),
    RTRIM(DADOSREQF.compCodFornecedor),
    RTRIM(DADOSREQF.compCodCondicaoPagamento),
    RTRIM(DADOSREQF.compFrete),
    RTRIM(DADOSREQF.compCodTransportadora)
    /* ,compValorFrete */