SQL Server中的总和返回错误的值
我在SQL Server 2014中遇到了一个特定的查询问题 sum函数返回错误的结果 在我的例子中,我的SQL查询只返回一行,有两个字段,例如:cost和key 值为10的成本和值为ke890wkw的键 我不知道为什么,但如果我像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
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提示。它的许多“特性”之一是能够随机返回丢失和/或重复的行。如果你真的担心准确性,你应该摆脱那些无锁提示。它的许多“特性”之一是能够随机返回丢失和/或重复的行。