如何找到为什么所有数据子集的总和比总数小 1
How to find why sum of all subsets of data is 1 less than total
我有一些获奖数据。每个奖励或赠款都有一个赠款编号和金额以及实体的 ID。我按 ID 总结了奖项的计数和所有奖项的金额。然后我 return 总行集或基于范围检查的子集。
如何找出为什么所有子集的总和总是比总集少一个?这是我的存储过程:
ALTER Procedure [dbo].[FLAS2_List_Awards_V3_PrepAwards]
/*
EXECUTE FLAS2_List_Awards_V3_PrepAwards 0
EXECUTE FLAS2_List_Awards_V3_PrepAwards 1
EXECUTE FLAS2_List_Awards_V3_PrepAwards 2
EXECUTE FLAS2_List_Awards_V3_PrepAwards 3
EXECUTE FLAS2_List_Awards_V3_PrepAwards 4
EXECUTE FLAS2_List_Awards_V3_PrepAwards 5
EXECUTE FLAS2_List_Awards_V3_PrepAwards 6
*/
-- populates #TempGrants according to range filter on TotalAmount
(
@Range int = 0
-- 0 = no filtering
-- 1 = < million
-- 2 = < million
-- 3 = < million
-- 4 = < million
-- 5 = < million
-- 6 = > million
)
As
-- if calling sproc did not create this table, create here to allow unit testing
IF OBJECT_ID('tempdb..#TempGrants') IS NULL
BEGIN
CREATE TABLE #TempGrants
(
ID nchar(6) NOT NULL
, TotalAwards decimal (16, 0) NULL
, TotalAmount decimal (16, 0) NULL
)
END
-- step 1. Summarize grants creating colums for HAVING filter
CREATE TABLE #TempGrantsUnfiltered
(
ID nchar(6) NOT NULL
, TotalAwards decimal (16, 0) NULL
, TotalAmount decimal (16, 0) NULL
)
insert into #TempGrantsUnfiltered
(
ID
, TotalAwards
, TotalAmount
)
select o.id
,COUNT( o.GrantNumber) as TotalAwards
,SUM( o.TotalObligatedAmount) as TotalAmount
from dbo.FLAS2_Grants o
group BY O.ID
-- step 2. HAVING filter returns grant totals per range test
insert into #TempGrants
(
ID
, TotalAwards
, TotalAmount
)
select o.id
,TotalAwards
,TotalAmount
from #TempGrantsUnfiltered o
WHERE
CASE
When @Range = 0 Then 1
When @Range = 1 AND TotalAmount < 1000000 Then 1
When @Range = 2 AND TotalAmount BETWEEN 1000001 AND 5000000 Then 1
When @Range = 3 AND TotalAmount BETWEEN 5000001 AND 10000000 Then 1
When @Range = 4 AND TotalAmount BETWEEN 10000001 AND 15000000 Then 1
When @Range = 5 AND TotalAmount BETWEEN 15000001 AND 20000000 Then 1
When @Range = 6 AND TotalAmount > 20000000 Then 1
ELSE 0 -- where 0 = 1 rejects record
END = 1 -- where 1 = 1 allows record
order by TotalAmount desc
当我执行以下块时:
EXECUTE FLAS2_List_Awards_V3_PrepAwards 0
EXECUTE FLAS2_List_Awards_V3_PrepAwards 1
EXECUTE FLAS2_List_Awards_V3_PrepAwards 2
EXECUTE FLAS2_List_Awards_V3_PrepAwards 3
EXECUTE FLAS2_List_Awards_V3_PrepAwards 4
EXECUTE FLAS2_List_Awards_V3_PrepAwards 5
EXECUTE FLAS2_List_Awards_V3_PrepAwards 6
我使用 SQL Management Studio 在消息 window 中得到以下结果:
(597 row(s) affected)
(597 row(s) affected)
(597 row(s) affected)
(65 row(s) affected)
(597 row(s) affected)
(341 row(s) affected)
(597 row(s) affected)
(89 row(s) affected)
(597 row(s) affected)
(39 row(s) affected)
(597 row(s) affected)
(23 row(s) affected)
(597 row(s) affected)
(39 row(s) affected)
我无法解释子集中缺失的行或总集中的额外行。有什么想法吗?
65 + 341 + 89 + 39 + 23 +39 = 596 < 597
将 case
表达式中的 TotalAmount < 1000000
更改为 TotalAmount < 1000001
。
我有一些获奖数据。每个奖励或赠款都有一个赠款编号和金额以及实体的 ID。我按 ID 总结了奖项的计数和所有奖项的金额。然后我 return 总行集或基于范围检查的子集。
如何找出为什么所有子集的总和总是比总集少一个?这是我的存储过程:
ALTER Procedure [dbo].[FLAS2_List_Awards_V3_PrepAwards]
/*
EXECUTE FLAS2_List_Awards_V3_PrepAwards 0
EXECUTE FLAS2_List_Awards_V3_PrepAwards 1
EXECUTE FLAS2_List_Awards_V3_PrepAwards 2
EXECUTE FLAS2_List_Awards_V3_PrepAwards 3
EXECUTE FLAS2_List_Awards_V3_PrepAwards 4
EXECUTE FLAS2_List_Awards_V3_PrepAwards 5
EXECUTE FLAS2_List_Awards_V3_PrepAwards 6
*/
-- populates #TempGrants according to range filter on TotalAmount
(
@Range int = 0
-- 0 = no filtering
-- 1 = < million
-- 2 = < million
-- 3 = < million
-- 4 = < million
-- 5 = < million
-- 6 = > million
)
As
-- if calling sproc did not create this table, create here to allow unit testing
IF OBJECT_ID('tempdb..#TempGrants') IS NULL
BEGIN
CREATE TABLE #TempGrants
(
ID nchar(6) NOT NULL
, TotalAwards decimal (16, 0) NULL
, TotalAmount decimal (16, 0) NULL
)
END
-- step 1. Summarize grants creating colums for HAVING filter
CREATE TABLE #TempGrantsUnfiltered
(
ID nchar(6) NOT NULL
, TotalAwards decimal (16, 0) NULL
, TotalAmount decimal (16, 0) NULL
)
insert into #TempGrantsUnfiltered
(
ID
, TotalAwards
, TotalAmount
)
select o.id
,COUNT( o.GrantNumber) as TotalAwards
,SUM( o.TotalObligatedAmount) as TotalAmount
from dbo.FLAS2_Grants o
group BY O.ID
-- step 2. HAVING filter returns grant totals per range test
insert into #TempGrants
(
ID
, TotalAwards
, TotalAmount
)
select o.id
,TotalAwards
,TotalAmount
from #TempGrantsUnfiltered o
WHERE
CASE
When @Range = 0 Then 1
When @Range = 1 AND TotalAmount < 1000000 Then 1
When @Range = 2 AND TotalAmount BETWEEN 1000001 AND 5000000 Then 1
When @Range = 3 AND TotalAmount BETWEEN 5000001 AND 10000000 Then 1
When @Range = 4 AND TotalAmount BETWEEN 10000001 AND 15000000 Then 1
When @Range = 5 AND TotalAmount BETWEEN 15000001 AND 20000000 Then 1
When @Range = 6 AND TotalAmount > 20000000 Then 1
ELSE 0 -- where 0 = 1 rejects record
END = 1 -- where 1 = 1 allows record
order by TotalAmount desc
当我执行以下块时:
EXECUTE FLAS2_List_Awards_V3_PrepAwards 0
EXECUTE FLAS2_List_Awards_V3_PrepAwards 1
EXECUTE FLAS2_List_Awards_V3_PrepAwards 2
EXECUTE FLAS2_List_Awards_V3_PrepAwards 3
EXECUTE FLAS2_List_Awards_V3_PrepAwards 4
EXECUTE FLAS2_List_Awards_V3_PrepAwards 5
EXECUTE FLAS2_List_Awards_V3_PrepAwards 6
我使用 SQL Management Studio 在消息 window 中得到以下结果:
(597 row(s) affected)
(597 row(s) affected)
(597 row(s) affected)
(65 row(s) affected)
(597 row(s) affected)
(341 row(s) affected)
(597 row(s) affected)
(89 row(s) affected)
(597 row(s) affected)
(39 row(s) affected)
(597 row(s) affected)
(23 row(s) affected)
(597 row(s) affected)
(39 row(s) affected)
我无法解释子集中缺失的行或总集中的额外行。有什么想法吗?
65 + 341 + 89 + 39 + 23 +39 = 596 < 597
将 case
表达式中的 TotalAmount < 1000000
更改为 TotalAmount < 1000001
。