为什么这些SQL查询从同一数据返回不同的结果?

时间:2020-07-30 22:43:15

标签: sql sql-server

我正在尝试使用一个查询,该查询给了我错误的信息,我看不到如何/为什么。

如果我将它们分解成简单的查询,我会得到期望的数字。

以下是给我带来麻烦的查询:

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 v18.5

bomBreakdown

1 个答案:

答案 0 :(得分:1)

简化版本和原始版本不同。

  1. 简化版没有DISTINCT。当存在DISTINCT时,将在生成不同的值列表之后对值求和。这意味着相同的值将仅被计数或相加一次。如果您需要简化版本的结果,请从原始查询的DISTINCTCOUNT中删除SUM

  2. 简化版本中的COUNT未指定列。 COUNT(*)COUNT(column)之间的区别在于,前者返回该行的行计数,而后者返回该列的非NULL行的计数。您可以运行此简单示例以查看它。您会看到它返回3, 2

    CREATE TABLE Table1 (Col1 INT);
    
    INSERT INTO Table1 VALUES (1), (2), (NULL);
    SELECT count(*), count(Col1) FROM table1;
    
    DROP TABLE1

如果您需要简化版本的结果,请使用保证原始查询中没有任何NULL值的列。

  1. 如果简化版本的结果正确,为什么不这样做:
    SELECT 
        [# of HR Devices] = SUM([Qty])
        , [Sum HR Devices]  = COUNT(*)
    FROM bomBreakdown 
    WHERE
        [SourcePartID] = '5157' 
        AND [Commodity Code] IN ('002') 
        AND [dbo].[fn_getFactoryStdCost]([ComponentPartID]) > 0 
        AND [Qty] > 0