减少每行的案例结果数量

时间:2013-08-27 07:03:06

标签: mysql sql

我有以下查询来计算每行的未结发票金额,但发票也可以有部分首期付款,所以我想从总金额中扣除总首付款的总和。

查询如下所示:

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

但是,当我这样做时,它完全忽略了所有没有付款的发票,只收到了首付的发票。

但我想要所有这些,我被困在这里。

有人能指出我正确的方向吗?

编辑:我想我必须从以下方向看,这有意义吗?

(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

我现在收到语法错误,但总是卡住了。 如果我的问题不明确,请让我知道我会尝试改写一切。

2 个答案:

答案 0 :(得分:2)

如果您想要做的只是'捕获'当您在BetalingenFactuur表中没有任何记录时返回的NULL,我建议使用COALESCE:

SELECT COALESCE(SUM(Bedrag), 0) FROM BetalingenFactuur WHERE Factuurnummer=F.Factuurnummer

这使得阅读更容易(也可能更快)。

答案 1 :(得分:0)

我已经弄清楚了。 我改变了这个

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

(CASE
   WHEN F.Factuurdatum BETWEEN DATE_SUB(CURDATE(), INTERVAL 14 DAY) AND NOW() THEN
   (CASE WHEN (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 13Days

在现有案例中添加另一个案例以检查发票是否有任何超额付款,并根据这一点切换查询给我正确的结果。