sql server—为什么这些sql查询从相同的数据返回不同的结果?

trnvg8h3  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(515)

我有一个查询,我正试图使用,这是给我的错误信息,我不知道如何/为什么。
如果我把它们分解成简单的查询,我就会得到我期望的数字。
这是一个给我带来麻烦的问题:

SELECT
    [# of HR Devices]   = COUNT(DISTINCT IIF((bom.[Commodity Code] IN ('002') AND [dbo].[fn_getFactoryStdCost]([ComponentPartID]) > 0 AND bom.[Qty] > 0),   bom.[Component Part #], NULL)),
    [Sum HR Devices]    = SUM(DISTINCT IIF((bom.[Commodity Code] IN ('002') AND [dbo].[fn_getFactoryStdCost]([ComponentPartID]) > 0 AND bom.[Qty] > 0), bom.[Qty], NULL))
FROM 
    bomBreakdown bom 
WHERE 
    [SourcePartID] = '5157'

我得到以下结果:


# of HR Devices | Sum HR Devices

----------------+---------------
      20        |     15

现在,如果我使用简化的(即长手)查询,如下所示:

SELECT COUNT(*)
FROM bomBreakdown 
WHERE [SourcePartID] = '5157' 
  AND [Commodity Code] IN ('002') 
  AND [dbo].[fn_getFactoryStdCost]([ComponentPartID]) > 0 
  AND [Qty] > 0

SELECT SUM([Qty])
FROM bomBreakdown 
WHERE [SourcePartID] = '5157' 
  AND [Commodity Code] IN ('002') 
  AND [dbo].[fn_getFactoryStdCost]([ComponentPartID]) > 0 
  AND [Qty] > 0

我得到41和61是正确的数字。
以下是数据,使用相同的函数添加stdcost以供参考。
我就是搞不懂为什么我得到20和15,基本上应该是同一个查询。
我正在使用:
sql server 2019(v15.0.2070.41)
ssms版本18.5

xzlaal3s

xzlaal3s1#

简化版和原版不一样。
简化版没有 DISTINCT . 什么时候 DISTINCT 如果存在,则在生成不同的值列表后对值求和。这意味着相同的值将只计算或求和一次。如果简化版本的结果是您所需要的,请删除 DISTINCT 从两者 COUNT 以及 SUM 在原始查询中。
简化版本中的计数未指定列。两者的区别 COUNT(*) 以及 COUNT(column) 前者返回行计数,而后者返回该列的非空行计数。您可以运行这个简单的示例来查看它。你会看到它回来的 3, 2 ```
CREATE TABLE Table1 (Col1 INT);

INSERT INTO Table1 VALUES (1), (2), (NULL);
SELECT count(*), count(Col1) FROM table1;

DROP TABLE1
如果简化版本的结果是您所需要的,那么使用一个保证没有任何结果的列 `NULL` 原始查询中的值。
如果简化版本的结果是正确的,为什么不这样做:

SELECT
[# of HR Devices] = SUM([Qty])
, [Sum HR Devices] = COUNT(*)
FROM bomBreakdown
WHERE
[SourcePartID] = '5157'
AND [Commodity Code] IN ('002')
AND [dbo].fn_getFactoryStdCost > 0
AND [Qty] > 0

相关问题