我有3张桌子:
表发票(发票,InvoiceAmount(浮动),其他信息...),表付款(付款,PaymentAmount(浮动),其他信息......)和表 PaymentsDet (ID,发票,付款,金额(浮动))。 PaymentsDet表将发票和付款与金额(该付款支付的发票部分)相关联。
我需要一个查询,它会返回有关每张发票+
的信息IF(该发票只有1份付款)
付款,SUM(PayementsDet.Amount),其他付款信息......
ELSE(超过1次付款或根本没有付款)
计数(付款),SUM(PayementsDet.Amount),完成其他付款信息 NULL 值或''< /强>
感谢您的时间,并希望有足够聪明的人可以帮助我。
编辑:
SELECT Factures.Facture, Factures.Client, Factures.DateFacture, Factures.MoisFacture, Factures.DateRéception, Factures.Echéance, Factures.Montant, Factures.TxTVA,
Factures.Activité,
(SELECT CASE WHEN SUM(Montant) IS NULL THEN '0' ELSE SUM(Montant) END AS Expr1
FROM RèglementsDet
WHERE (Facture = Factures.Facture) AND (Validé = 1)) AS MontantRegl,
(SELECT CASE WHEN COUNT(DISTINCT Règlements.Règlement) > '1' THEN COUNT(DISTINCT Règlements.Règlement)
WHEN COUNT(DISTINCT Règlements.Règlement) = '1' THEN
(SELECT MIN(Règlements.Règlement) AS Expr1
FROM Règlements INNER JOIN
RèglementsDet ON Règlements.Règlement = RèglementsDet.Règlement
WHERE (RèglementsDet.Facture = Factures.Facture)) END AS Règlement
FROM Règlements INNER JOIN
RèglementsDet AS RèglementsDet_2 ON Règlements.Règlement = RèglementsDet_2.Règlement
WHERE (RèglementsDet_2.Facture = Factures.Facture) AND (RèglementsDet_2.Validé = 1)) AS Règlement
FROM Factures LEFT OUTER JOIN
RèglementsDet AS RèglementsDet_1 ON Factures.Facture = RèglementsDet_1.Facture
GROUP BY Factures.Facture, Factures.Client, Factures.DateFacture, Factures.MoisFacture, Factures.DateRéception, Factures.Echéance, Factures.Montant, Factures.TxTVA,
Factures.Activité
我想如果有人得到更好(更易读)的查询,我想出来了。
答案 0 :(得分:0)
因为您正在使用CASE语句,我想您应该很容易理解这个SQL查询并将名称调整为您的字段名称:
(SELECT P.Payement,SUM(D.Amount), P.CreatedAt, P.Expired FROM Invoices I, Payements P, PayementsDet D WHERE 1 = (
SELECT(
CASE
WHEN (SELECT count(D.Payement) FROM Invoices I, Payements P WHERE ( D.Invoice = I.Invoice AND P.Payement = D.Payement ) GROUP BY I.Invoice) = 1
THEN 1
ELSE 0
END)
FROM Invoices I, Payements P, PayementsDet D
))
UNION
(SELECT P.Payement,SUM(D.Amount), null, null FROM Invoices I, Payements P, PayementsDet D WHERE 0 = (
SELECT(
CASE
WHEN (SELECT count(D.Payement) FROM Invoices I, Payements P WHERE ( D.Invoice = I.Invoice AND P.Payement = D.Payement ) GROUP BY I.Invoice) = 1
THEN 1
ELSE 0
END)
FROM Invoices I, Payements P, PayementsDet D
));
答案 1 :(得分:0)
谢谢您的时间和精力。
我的案例中的问题不在于有1或0付款时,但真正的问题是当我为同一张发票多次付款时。最后,我发现即使它有点复杂,我仍然可以做到这一点,但是我发现希望它可以帮助其他人。
SELECT Factures.Facture, Factures.Client AS [Code C/F], Factures.DateFacture, Factures.MoisFacture, Factures.DateRéception, Factures.Echéance, Factures.Montant,
Factures.TxTVA, Factures.Activité,
(SELECT CASE WHEN SUM(Montant) IS NULL THEN '0' ELSE SUM(Montant) END AS Expr1
FROM RèglementsDet
WHERE (Facture = Factures.Facture) AND (Validé = 1)) AS MontantRegl,
(SELECT CASE WHEN COUNT(DISTINCT Règlements.Règlement) > '1' THEN COUNT(DISTINCT Règlements.Règlement)
WHEN COUNT(DISTINCT Règlements.Règlement) = '1' THEN
(SELECT MIN(Règlements.Règlement) AS Expr1
FROM Règlements INNER JOIN
RèglementsDet ON Règlements.Règlement = RèglementsDet.Règlement
WHERE (RèglementsDet.Facture = Factures.Facture)) END AS Règlement
FROM Règlements INNER JOIN
RèglementsDet AS RèglementsDet_2 ON Règlements.Règlement = RèglementsDet_2.Règlement
WHERE (RèglementsDet_2.Facture = Factures.Facture) AND (RèglementsDet_2.Validé = 1)) AS Règlement,
(SELECT CASE WHEN COUNT(DISTINCT Règlements_1.Règlement) = '1' THEN
(SELECT TOP (1) Règlements.Banque AS Expr1
FROM Règlements INNER JOIN
RèglementsDet ON Règlements.Règlement = RèglementsDet.Règlement
WHERE (RèglementsDet.Facture = Factures.Facture)) ELSE '' END AS Expr1
FROM Règlements AS Règlements_1 INNER JOIN
RèglementsDet AS RèglementsDet_2 ON Règlements_1.Règlement = RèglementsDet_2.Règlement
WHERE (RèglementsDet_2.Facture = Factures.Facture) AND (RèglementsDet_2.Validé = 1)) AS Banque,
(SELECT CASE WHEN COUNT(DISTINCT Règlements_1.Règlement) = '1' THEN
(SELECT TOP (1) Règlements.ModeDeRèglement AS Expr1
FROM Règlements INNER JOIN
RèglementsDet ON Règlements.Règlement = RèglementsDet.Règlement
WHERE (RèglementsDet.Facture = Factures.Facture)) ELSE '' END AS Expr1
FROM Règlements AS Règlements_1 INNER JOIN
RèglementsDet AS RèglementsDet_2 ON Règlements_1.Règlement = RèglementsDet_2.Règlement
WHERE (RèglementsDet_2.Facture = Factures.Facture) AND (RèglementsDet_2.Validé = 1)) AS ModeRegl,
(SELECT CASE WHEN COUNT(DISTINCT Règlements_1.Règlement) = '1' THEN
(SELECT TOP (1) Règlements.NumDocument AS Expr1
FROM Règlements INNER JOIN
RèglementsDet ON Règlements.Règlement = RèglementsDet.Règlement
WHERE (RèglementsDet.Facture = Factures.Facture)) ELSE '' END AS Expr1
FROM Règlements AS Règlements_1 INNER JOIN
RèglementsDet AS RèglementsDet_2 ON Règlements_1.Règlement = RèglementsDet_2.Règlement
WHERE (RèglementsDet_2.Facture = Factures.Facture) AND (RèglementsDet_2.Validé = 1)) AS NumDocument,
(SELECT CASE WHEN COUNT(DISTINCT Règlements_1.Règlement) = '1' THEN
(SELECT TOP (1) Règlements.DateRèglement AS Expr1
FROM Règlements INNER JOIN
RèglementsDet ON Règlements.Règlement = RèglementsDet.Règlement
WHERE (RèglementsDet.Facture = Factures.Facture)) ELSE NULL END AS Expr1
FROM Règlements AS Règlements_1 INNER JOIN
RèglementsDet AS RèglementsDet_2 ON Règlements_1.Règlement = RèglementsDet_2.Règlement
WHERE (RèglementsDet_2.Facture = Factures.Facture) AND (RèglementsDet_2.Validé = 1)) AS DateRèglement, Factures.Montant -
(SELECT CASE WHEN SUM(Montant) IS NULL THEN '0' ELSE SUM(Montant) END AS Expr1
FROM RèglementsDet AS RèglementsDet_3
WHERE (Facture = Factures.Facture) AND (Validé = 1)) AS Solde
FROM Factures LEFT OUTER JOIN
RèglementsDet AS RèglementsDet_1 ON Factures.Facture = RèglementsDet_1.Facture
GROUP BY Factures.Facture, Factures.Client, Factures.DateFacture, Factures.MoisFacture, Factures.DateRéception, Factures.Echéance, Factures.Montant, Factures.TxTVA,
Factures.Activité
P.S:Facture =发票和Règlement=付款