Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的总和返回错误的值_Sql_Sql Server_Sum - Fatal编程技术网

SQL Server中的总和返回错误的值

SQL Server中的总和返回错误的值,sql,sql-server,sum,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 带有此“bug”(?)的完整而真实的查询位于图片sql2上 SELECT SUM(CONV

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

sum函数返回错误的结果

在我的例子中,我的SQL查询只返回一行,有两个字段,例如:cost和key

值为10的成本和值为ke890wkw的键

我不知道为什么,但如果我像

SELECT SUM(COST) TOTAL_COST, RTRIM(KEY) 
FROM TABLE 
WHERE KEY = 'ke890wkw'
它返回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
这是同一个查询,外部求和返回不正确的值

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/ww4gp.png

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

如果运行此代码,您应该会看到两条重复的记录。您得到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 */

如果运行此代码,应该会看到两条重复的记录。您得到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 */

<正在发生的事情的简化例子,请考虑这张表:

col1   |   col2
 A     |    10
 A     |    10
这将返回一行:

SELECT col1, col2
FROM table
GROUP BY col1, col2

col1   |   col2
 A     |    10
添加外部
和将应用于该行:

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

col1   |   col2
 A     |    10

但是,直接添加<代码>和> /代码>将同时考虑行和值的两倍:

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

col1   |   col2
 A     |    20

<正在发生的事情的简化例子,请考虑这张表:

col1   |   col2
 A     |    10
 A     |    10
这将返回一行:

SELECT col1, col2
FROM table
GROUP BY col1, col2

col1   |   col2
 A     |    10
添加外部
和将应用于该行:

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

col1   |   col2
 A     |    10

但是,直接添加<代码>和> /代码>将同时考虑行和值的两倍:

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

col1   |   col2
 A     |    20

是的,但不是。移除总和,(你可以在图片中看到)查询结果只有一行,不重复。不要按compValorFrete分组,那么你应该看到两个结果是的,但不是。移除总和,(你可以在图片中看到)查询结果只有一行,不重复。不要按compValorFrete分组,那么你应该看到两个结果你是对的!这是我唯一没有测试过的东西,因为我专注于这个问题,对这个细节视而不见。呵呵,谢谢!:)所以,在我的例子中,正确的方法是使用外和?当不使用GROUPBY时,subselect返回2行,我找不到原因,因为它应该返回一行。无论如何,要“解决”这个问题,最好的办法是什么?我找到了!该表已编辑,现在有版本字段,重复值是由版本数引起的。您的权利!这是我唯一没有测试过的东西,因为我专注于这个问题,对这个细节视而不见。呵呵,谢谢!:)所以,在我的例子中,正确的方法是使用外和?当不使用GROUPBY时,subselect返回2行,我找不到原因,因为它应该返回一行。无论如何,要“解决”这个问题,最好的办法是什么?我找到了!该表已编辑,现在有版本字段,重复值是由版本数引起的如果您真的关心准确性,您应该去掉那些nolock提示。它的许多“特性”之一是能够随机返回丢失和/或重复的行。如果你真的担心准确性,你应该摆脱那些无锁提示。它的许多“特性”之一是能够随机返回丢失和/或重复的行。