私はいくつかの賞データを持っています。各賞または助成金には、助成金番号と金額、および事業体のIDが記載されています。私は賞の数とすべての賞の額をIDで要約します。次に、範囲チェックに基づいて行の合計セットまたはサブセットを返します。データのすべてのサブセットの合計が1未満であることを見つける方法
すべてのサブセットの合計が、常に1つの合計セットよりも少ない理由を確認するにはどうすればよいですか?ここに私のストアドプロシージャです:
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を使用して、私のメッセージ・ウィンドウに次のような結果を得る:私は、次のブロックを実行すると
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 = < $1 million
-- 2 = < $5 million
-- 3 = < $10 million
-- 4 = < $15 million
-- 5 = < $20 million
-- 6 = > $20 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
(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
「TotalAmount <1000000」は、「TotalAmount <= 1000000」または「TotalAmount <1000001」ではありませんか? – SqlZim
私はSqlZimに同意します.TotalAmount = 1000000の場合、これはいずれのフィルターでも取得されませんが、フィルターされていない合計でピックアップされます。 – Skippy