我正在尝试使用一个查询,该查询给了我错误的信息,我看不到如何/为什么。
如果我将它们分解成简单的查询,我会得到期望的数字。
以下是给我带来麻烦的查询:
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基本上应该是相同的查询。
我正在使用:
答案 0 :(得分:1)
简化版本和原始版本不同。
简化版没有DISTINCT
。当存在DISTINCT
时,将在生成不同的值列表之后对值求和。这意味着相同的值将仅被计数或相加一次。如果您需要简化版本的结果,请从原始查询的DISTINCT
和COUNT
中删除SUM
。
简化版本中的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
值的列。
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