0

私はいくつかの賞データを持っています。各賞または助成金には、助成金番号と金額、および事業体の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 
+0

「TotalAmount <1000000」は、「TotalAmount <= 1000000」または「TotalAmount <1000001」ではありませんか? – SqlZim

+0

私はSqlZimに同意します.TotalAmount = 1000000の場合、これはいずれのフィルターでも取得されませんが、フィルターされていない合計でピックアップされます。 – Skippy

答えて

1

あなたcase式のTotalAmount < 1000001に変更TotalAmount < 1000000

+0

ありがとう!私はいくつかの間違いを疑ったが、それを見ることができなかった。 –

+0

@JohnAdamsお手伝いします! – SqlZim

+0

ちょっと注意してください - 私はこれを常に見ています。人々は、範囲の境界で何が起こりたいのかを明確に指定していません。ストアドプロシージャのコメントでは、@ Range = 2のようなものがTotalAmount <500万ドルのフィルタになりますが、ケースステートメントはTotalAmount <= $ 5millionをフィルタリングします。どちらがいいですか? – Skippy

関連する問題