2013-10-07 10 views
7

dobry dzień każdego tutaj jest mój kodHrabia Wracając puste zamiast 0

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LOAN)) as [Month] 
    ,COUNT(PIT.fld_ID)'COUNT' 
    ,SUM (PIT.fld_GRAM)'GRAMS' 
    ,SUM (PH.fld_AMNT)'PRINCIPAL' 
FROM #AllExpired AE 
    INNER JOIN Transactions.tbl_ITEM PIT 
    ON AE.fld_MAINID=PIT.fld_MAINID 
    INNER JOIN Transactions.tbl_HISTO PH 
    ON AE.fld_MAINID =PH.fld_MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LOAN))) 

problem jestem stoi to, że mój Hrabia funkcja nie zwraca 0 jeśli nie ma wartości, Suma funkcja nie zwraca wartości NULL, jeśli nie są pobierane wartości wynikowe, zamiast tego po prostu wyprowadza puste, dlaczego tak jest? i jak mogę to naprawić?

tu jest zrzut ekranu z wyjściem próbki

A

oczywiście to nie chcę, chcę go do wyjścia zero i null. pomóżcie mi, nie wiem, co jest nie tak. Dziękuję Ci.

+2

Jaką wartość można oczekiwać, aby pojawić się w kolumnie 'Month' - czy SQL Server po prostu magicznie tworzą wartość dla tam? –

+1

Ale gdy nie ma * nie * wierszy do przetworzenia - warunek, w którym oczekiwany wynik to 0 - z czego to będzie obliczane? –

+0

ohhh teraz rozumiem :) dzięki @Damien_The_Unbeliever pomógł mi ponownie tym razem :) – user2705620

Odpowiedz

10

Nie można oczekiwać wszelkie rekordy mają być wyprowadzane podczas używania Klauzula GROUP BY, gdy w źródle nie ma rekordów.

Jeśli chcesz wyjście 0 z funkcji SUM i liczyć, to nie należy używać GROUP BY.

Powodem jest to, że kiedy nie masz żadnych rekordów, klauzula GROUP BY nie mają nic do grupy według, a następnie nie jest w stanie podać żadnych wyników.

Na przykład:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 

powróci jeden rekord z wartością '0', gdzie jako:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 
GROUP BY [Dummy] 

powróci żadnych rekordów.

+0

dlatego użyłem przez grupę z powodu tego błędu 'Msg 8120, Level 16, State 1, Linia 2 Column„# AllExpired.fld_LoanDate”jest nieprawidłowa w liście wyboru, ponieważ nie jest zawarty w funkcji agregującej lub klauzuli GROUP BY. " Jakąkolwiek sugestię? jak usunąć błąd bez użycia grupy przez? – user2705620

+0

Cóż, nie można usunąć klauzuli GROUP BY, jeśli chcesz listę całkowitej liczby, gramów i głównych dla każdego miesiąca miesiąca pożyczki. Brzydkie obejście problemu, jeśli chcesz, aby twoje pierwotne zapytanie zwróciło wiersz z literą 0, gdy nie ma żadnych rekordów, jest takie, aby dodać coś takiego do zapytania: 'UNION SELECT NULL AS [miesiąc], 0 AS [COUNT], 0 AS [GRAMS], 0 AS [PRINCIPAL] WHERE (SELECT COUNT (*) FROM # AllExpired) = 0', ale lepszym rozwiązaniem byłoby, gdyby aplikacja obsługiwała oryginalne zapytanie, nie zwracając żadnych wierszy. – Dan

+0

Istnieją inne sposoby obejścia tego problemu, możesz również użyć 'COALESCE' z każdym polem, aby zwrócić 0, gdy wynikiem jest' NULL'. Lub użyj skorelowanego podzapytania, aby upewnić się, że dane "najwyższego poziomu" są zawsze zwracane, a wszelkie funkcje agregujące zwrócą 0. – Tony

1

Być może #AllExpired jest pusty, lub jedno z połączeń nie zwraca żadnych wyników?

Pamiętaj sprzężenia wewnętrzne potrzebują wyniki na obu stronach w celu powrotu, więc dlatego #AllExpired jest pusty łączenia nic nie zwraca.

zmienić go na zewnętrzną przyłączyć.

+0

tak jest pusty, dobrze? czy nie ma wyjścia zero? kiedy używam funkcji count>? – user2705620

2

to sobie wyobrazić, trzeba zmienić łączy z INNER do OUTER celu zapewnienia wiersze są zwracane nawet wtedy, gdy nie ma odpowiedniego rekordu w tbl_PawnItem -

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)) as [Month] 
    ,COUNT(PIT.fld_PawnItemID)'COUNT' 
    ,SUM (PIT.fld_KaratGram)'GRAMS' 
    ,SUM (PH.fld_PrincipalAmt)'PRINCIPAL' 
FROM #AllExpired AE 
    LEFT JOIN Transactions.tbl_PawnItem PIT 
     ON AE.fld_PawnMainID=PIT.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnHisto PH 
     ON AE.fld_PawnMainID=PH.fld_PawnMainID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LoanDate))) 
+0

wciąż puste. :(. – user2705620

Powiązane problemy