0

Ich habe einige Award-Daten. Jeder Award oder Grant hat eine Grant-Nummer und einen Betrag und die ID des Unternehmens. Ich fasse die Anzahl der Auszeichnungen und die $ Menge aller Auszeichnungen nach ID zusammen. Dann gebe ich entweder eine Gesamtmenge von Zeilen oder eine Teilmenge basierend auf einer Bereichsprüfung zurück.Wie zu finden, warum die Summe aller Teilmengen von Daten 1 weniger als insgesamt ist

Wie kann ich herausfinden, warum die Summe aller Teilmengen immer um eins kleiner ist als die Gesamtsumme? Hier ist meine gespeicherten Prozedur ist:

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  

Wenn ich den folgenden Block ausführen:

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 

ich die folgenden Ergebnisse in meinem Fenster Meldungen mit SQL Management Studio:

(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) 

kann ich nicht berücksichtigen Sie die fehlende Zeile in den Teilmengen oder die zusätzliche Zeile in der gesamten Menge. Irgendwelche Ideen?

65 + 341 + 89 + 39 + 23 +39 = 596 < 597 
+0

Sollte 'TotalAmount <1000000' nicht 'TotalAmount <= 1000000' oder' TotalAmount <1000001' sein? – SqlZim

+0

Ich stimme mit SqlZim überein - wenn Sie einen Award haben, bei dem der TotalAmount = 1000000 ist, wird dieser von keinem der Filter abgeholt, aber er wird von der ungefilterten Summe aufgenommen. – Skippy

Antwort

1

ändern TotalAmount < 1000000 zu TotalAmount < 1000001 in Ihrem case Ausdruck.

+0

Vielen Dank! Ich vermutete einen dummen Fehler, konnte es aber einfach nicht sehen. –

+0

@JohnAdams Glücklich zu helfen! – SqlZim

+0

Sei einfach vorsichtig - ich sehe das die ganze Zeit. Die Menschen legen nicht klar fest, was sie an den Grenzen der Bereiche tun wollen. Die Kommentare in Ihrer gespeicherten Prozedur sagen Dinge wie @Range = 2 Filter für TotalAmount <$ 5 Millionen, jedoch wird Ihre Case-Anweisung nach TotalAmount <= 5 Millionen filtern. Welche willst du? – Skippy

Verwandte Themen