我有以下查询,该查询计算每行的未结发票金额,但是发票也可以具有部分预付款,因此我想从总额中减去预付款总额。
查询如下所示:
SELECT G.Bedrijfsnaam, `F`.`GebruikerID`, `F`.`Factuurnummer`, `F`.`Factuurdatum`, `F`.`Statusdatum`, `F`.`Subtotaal` - `F`.`Korting` + `F`.`Verzendkosten` AS `Subtotaal`, `F`.`BTWPercentage`, `FS`.`Naam`, `FS`.`Openstaand`, `B`.`Dagen`, `F`.`Betaalmethode`,
CASE
WHEN F.Factuurdatum BETWEEN DATE_SUB(CURDATE(), INTERVAL 14 DAY) AND NOW()
THEN ((`F`.`Subtotaal` - `F`.`Korting` + `F`.`Verzendkosten`) * ( 1 + (F.BTWPercentage / 100 ) ) )
END AS 13Days
FROM `Factuur` AS `F`
LEFT JOIN Betaalmethode AS B on B.ID=F.Betaalmethode
JOIN Factuurstatus AS FS ON FS.ID=F.Factuurstatus
JOIN Gebruiker AS G ON G.ID=F.GebruikerID
JOIN Betaalmethode AS BM ON BM.ID=F.Betaalmethode
WHERE FS.Openstaand = 1
AND F.Factuurstatus != 11
AND F.Factuurstatus != 6
AND F.Factuurstatus != 7
我以为可以通过在“ THEN”行中添加以下行来实现此目的:
- (SELECT SUM(Bedrag) FROM BetalingenFactuur WHERE Factuurnummer=F.Factuurnummer)
那会给我
THEN ((`F`.`Subtotaal` - `F`.`Korting` + `F`.`Verzendkosten`) * ( 1 + (F.BTWPercentage / 100 ) ) - (SELECT SUM(Bedrag) FROM BetalingenFactuur WHERE Factuurnummer=F.Factuurnummer) )
但是,当我这样做时,它完全忽略了所有没有dowypayments的发票,而只得到具有预付款的发票。
但是我想要所有人,我被困在这里。
有人可以指出我正确的方向吗?
编辑:我认为我必须朝以下方向看,这有意义吗?
(CASE
WHEN F.Factuurdatum BETWEEN DATE_SUB(CURDATE(), INTERVAL 9999 DAY) AND DATE_SUB(CURDATE(), INTERVAL 91 DAY)
(CASE (SELECT SUM(Bedrag) FROM BetalingenFactuur WHERE Factuurnummer=F.Factuurnummer) IS NOT NULL THEN
((`F`.`Subtotaal` - `F`.`Korting` + `F`.`Verzendkosten`) * ( 1 + (F.BTWPercentage / 100 ) ) - (SELECT SUM(Bedrag) FROM BetalingenFactuur WHERE Factuurnummer=F.Factuurnummer) )
ELSE
((`F`.`Subtotaal` - `F`.`Korting` + `F`.`Verzendkosten`) * ( 1 + (F.BTWPercentage / 100 ) ) )
END)
END) AS 91Dagen
我现在遇到语法错误,完全卡住了。
如果我的问题不清楚,请让我知道,我将尝试重述所有内容。
最佳答案
如果您要做的只是“捕获”在BetalingenFactuur表中没有任何记录时返回的NULL,我建议使用COALESCE代替:
SELECT COALESCE(SUM(Bedrag), 0) FROM BetalingenFactuur WHERE Factuurnummer=F.Factuurnummer
这使它更易于阅读(也可能更快)。