rijen missen in sql statement

Status
Niet open voor verdere reacties.

barendrecht82

Gebruiker
Lid geworden
24 mrt 2013
Berichten
230
Hallo,

Ik heb het volgende probleem.

In sql view BB_FMF krijg je alle grootboeknummers te zien met de beginbalans bedragen. Dit werkt en sluit.
Code:
SELECT        TOP (100) PERCENT dbo.View_Balans.GeneralLedger, dbo.grtbk.oms25_0, dbo.grtbk.bal_vw, ROUND(COALESCE (SUM(dbo.View_Balans.Expr2), 0), 2) AS bb
FROM            dbo.View_Balans LEFT OUTER JOIN
                         dbo.grtbk ON dbo.View_Balans.GeneralLedger = dbo.grtbk.reknr
GROUP BY dbo.View_Balans.GeneralLedger, dbo.grtbk.bal_vw, dbo.grtbk.oms25_0
ORDER BY dbo.View_Balans.GeneralLedger

In sql view FMF_per periode hoor je alle grootboeknummers te zien met de alle boekingen per periode en de bijbehoordende beginbalans. Nu zie je niet alle regels..

Code:
SELECT        TOP (100) PERCENT dbo.View_BB_fmf.GeneralLedger AS Expr1, dbo.View_BB_fmf.oms25_0, dbo.View_BB_fmf.bb AS BB, SUM(CASE WHEN MONTH(ReportingDate) 
                         = '1' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [1], SUM(CASE WHEN MONTH(ReportingDate) = '2' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [2], 
                         SUM(CASE WHEN MONTH(ReportingDate) = '3' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [3], SUM(CASE WHEN MONTH(ReportingDate) = '4' THEN (AmountDCDebit - AmountDCCredit) 
                         ELSE 0 END) AS [4], SUM(CASE WHEN MONTH(ReportingDate) = '5' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [5], SUM(CASE WHEN MONTH(ReportingDate) 
                         = '6' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [6], SUM(CASE WHEN MONTH(ReportingDate) = '7' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [7], 
                         SUM(CASE WHEN MONTH(ReportingDate) = '8' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [8], SUM(CASE WHEN MONTH(ReportingDate) = '9' THEN (AmountDCDebit - AmountDCCredit) 
                         ELSE 0 END) AS [9], SUM(CASE WHEN MONTH(ReportingDate) = '10' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [10], SUM(CASE WHEN MONTH(ReportingDate) 
                         = '11' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [11], SUM(CASE WHEN MONTH(ReportingDate) = '12' THEN (AmountDCDebit - AmountDCCredit) ELSE 0 END) AS [12]
FROM            dbo.View_BB_fmf LEFT OUTER JOIN
                         dbo.GeneralLedgerBalances ON dbo.View_BB_fmf.GeneralLedger = dbo.GeneralLedgerBalances.GeneralLedger
GROUP BY YEAR(dbo.GeneralLedgerBalances.ReportingDate), dbo.View_BB_fmf.bb, dbo.View_BB_fmf.GeneralLedger, dbo.View_BB_fmf.oms25_0
HAVING        (YEAR(dbo.GeneralLedgerBalances.ReportingDate) = 2021)
ORDER BY Expr1

Dus ik wil in de FMF per periode dus alle regels zien die uit BB_FMF komen.. wat doe ik fout?
 
Wat is dit voor veld? dbo.grtbk.oms25_0
Ik hoop niet dat je velden gaat oplopend gaat nummeren?

Ik zou je aanraden om je databasestructuur te
normaliseren. Er is geen enkele reden om velden horizontaal uit te
breiden met class-namen.
 
Geen oplopend getal dus waarbij je elke keer je structuur moet wijzigen?
 
De structuur van je database. Die wil je zo min mogelijk aanpassen, en zeker niet zomaar als je velden te kort komt bij oplopende veldnamen.
Ben je bekend met databasenormalisatie? Zo nee, dan is het interessant leesvoer om er eens in te duiken. Het is zonde als je straks een database hebt die niet efficient is.

Dus kunnen we ooit een dbo.grtbk.oms25_1 of dbo.grtbk.oms26_0 of dbo.grtbk.oms26_1 of iets dergelijks verwachten als veld?
Zo ja: Fout! Lees de link over databasenormalisatie, en maak een aparte tabel aan om deze kunnen koppelen met de juiste items
Zo nee: Dan heb ik niks gezegd, maar blijft het een goed idee om die link te bekijken als je geen ervaring met databasenormalisatie hebt.
 
Laatst bewerkt:
Ok. duidelijk. Omschrijving veld is geen verplichting die mag eruit gehaald worden.

Hoe krijg ik dan wel de juiste uitkomst?
 
Het gaat erom of ze oplopend genummerd zijn.
Dus wat is de conclusie van je uit mijn laatste alinea?
 
De grootboeknummers moeten dus dan oplopend zijn klopt. Antwoord Zo nee
Huh? Draai je het niet om?
Als ze oplopend genummerd zijn als velden, dan ben je fout bezig.
is dat het geval?

Kortom: "Dus kunnen we ooit een dbo.grtbk.oms25_1 of dbo.grtbk.oms26_0 of dbo.grtbk.oms26_1 of iets dergelijks verwachten als veld?"
Ja of nee?
 
Dan is het duidelijk. Was gewoon even een heads-up.
 
Hi, eerst en vooral: in views gebruik je alleen een order by als dat ertoe doet: bv als je alleen de eerste 10 regels wil zien van een bepaalde volgorde. Order by doe je alleen in de query die je op de view baseert. In views zorgt de select top (100) ... order by alleen voor overbodige complexiteit en traagheid. Waarschijnlijk is TOP(100) er ook automatisch toegevoegd wanneer je de view creëerde.
Wat je vraag betreft: aangezien je het criterium : alleen de lijnen van het jaar 2021 toevoegt zou ik op het eerste zicht zeggen dat de mankerende lijnen niet aan dit criterium voldoen? Aangezien je geen bewerking doet op YEAR(dbo.GeneralLedgerBalances.ReportingDate) kan je dat trouwens ook in een WHERE clause zetten, dan hoef je daar niet op te groeperen en wordt de instructie nog simpelder.
 
meer uitleg over ORDER BY in een view : https://www.mssqltips.com/sqlservertip/4488/avoid-order-by-in-sql-server-views/

wat betreft het verschil tussen WHERE en HAVING: WHERE gebruik je als je een test criterium voor één of meerder waarden ingeeft, in een groepsquery gaat deze de gegevens filteren voordat de groepering wordt uitgevoerd.
HAVING wordt in een groepsquery gebruikt om het resultaat van een groepsbewerking (sum, average, min, max, ...) te filtreren. Jou expressie
YEAR(dbo.GeneralLedgerBalances.ReportingDate) = 2021
is duidelijk een test op één waarde: het jaar van de datum, en niet een test op een groepsbewerking: bv het gemiddelde van alle jaren. Daarom hoort het in de WHERE expressie en niet het HAVING deel.

Hoe dan ook worden alle resultaten die niet van 2021 zijn in de 2de query eruit gefilterd en in de eerste niet wat het verschil kan zijn waarom je bepaalde regels niet ziet.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan