Hej, Ta det i mindre steg. Hej Niklas,Hitta "nollfakturor"
Jag har fastnat på ett litet problem.
Jag ska hitta fakturor där varje konto (glaccount) var för sig summerar till 0, se Nollfaktura.
I en vanlig faktura sumerar inte kontona (glaccount) till 0 även om det kan förekomma, se Vanlig faktura.
Alla fakturor sumerar totalt på net, gross , tax till 0. Det räcker inte alltså att bara kolla om fakturarn summerar till 0 eller ej, utan att mitt problem är att jag måste kolla att alla kontonon var för sig i fakturan summerar till 0.
Nollfaktura:
voucher glaccount net gross tax
-------------------- --------- --------------------- --------------------- ---------------------
656780 146061 -750,00 -750,00 0,00
656780 146061 750,00 750,00 0,00
656780 499990 -750,00 -750,00 0,00
656780 499990 750,00 750,00 0,00
Vanlig faktura:
voucher glaccount netamount gross tax
-------------------- --------- --------------------- --------------------- ---------------------
4725848 146061 522,00 522,00 0,00
4725848 142088 -522,00 -522,00 0,00
4725848 146079 522,00 522,00 0,00
4725848 146079 -522,00 -522,00 0,00
Jag har kommit så långt att jag kan ta fram alla förekomster av konton som summerar till 0.
Men då får jag träff på varje faktura som har en så kallad motbokningsrad.
select vouchernumber, GLAccount
From FakturaTable
Where DOC_ID = 'DOC1100246'
Group by vouchernumber, GLAccount
Having sum(netamount)=0
Jag behöver alltså få träff på en faktura där alla konton summerar till 0.
Jag tacksam för något uppslag på att komma vidare.
/MikaelSv: Hitta "nollfakturor"
1. Vilka kombinationer faktura / konto finns det, och vilka summor har de?
SELECT voucher, glaccount, SUM(net), SUM(gross), SUM(tax) FROM Tabell
GROUP BY voucher, glaccount
2. Och vilka är noll?
SELECT voucher, glaccount, SUM(net), SUM(gross), SUM(tax) FROM Tabell
GROUP BY voucher, glaccount WHERE SUM(net) = 0 AND SUM(gross) = 0 ...
Förmodligen bör du byta ut = 0 mot ABS(SUM(net)) < eps, men det är en annan sak.
3. Du ska välja ut de som bara har noll. Det enklaste då är att först ta fram de som har såna som _inte_ är noll:
SELECT voucher, glaccount, SUM(net), SUM(gross), SUM(tax) FROM Tabell
GROUP BY voucher, glaccount WHERE SUM(net) <> 0 OR SUM(gross) <> 0 ...
4. Sen väljer du ut alla de voucherna:
X = SELECT DISTINCT voucher FROM (SELECT voucher, glaccount, SUM(net), SUM(gross), SUM(tax) FROM Tabell
GROUP BY voucher, glaccount WHERE SUM(net) <> 0 OR SUM(gross) <> 0 ...)
Och slutligen så har du alla "vanliga". För att ta fram nollfakturorna så gör du bara
SELECT Voucher FROM Tabell WHERE Voucher NOT IN (X)Sv:Hitta "nollfakturor"
Tack! Det löste problemet perfekt.
Du har skrivit väldigt bra och tydliga instruktioner. Det är ju mycket bättre att få tänket förklarat än bara få lösningen serverad på ett fat. Nu har jag fått en struktur på hur jag ska lösa flera andra liknande problem som jag har.
Hälsningar,
Mikael