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
正在发生的事情的简化示例,请考虑下表:
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)