J'ai deux tables une avec le client et une autre avec des factures. J'ai besoin de trouver tous les clients qui ont plus d'une facture avec des jours différents dans une période.

Tableau de facturation: Accountnum Date In Status ...

Table des clients: Accountnum ...

J'ai deux problèmes:

1: Je peux obtenir les clients qui ont plus d'une facture, mais je ne sais pas comment vérifier s'ils sont des jours différents.

2: Le client montre plus d'une fois dans cette requête qu'il n'a besoin d'en afficher que quelques-uns.

SELECT c.*
FROM Invoice I
INNER JOIN Customer C
ON I.Accountnum= C.Accountnum
WHERE EXISTS(SELECT DISTINCT I.AccountnumFROM Invoice
         WHERE C.Accountnum = I.Accountnum
         and i.Datein >= '2020-03-01' and i.Datein <= '2020-05-31'
         and (IStatus <> 'V' or IStatus IS NULL)
         GROUP BY I.Accountnum
         HAVING COUNT(*) > 1)
-1
Kim HJ 27 août 2020 à 01:36

2 réponses

Meilleure réponse

Un moyen simple de vérifier si un client donné a des factures à deux dates différentes consiste à s'assurer que la date de facturation minimale diffère de la date de facturation maximale. Vous pouvez écrire ceci sous forme de requête join:

select c.*
from customer c
inner join (
    select accountnum
    from invoice
    where 
        datein >= '2020-03-01' and datein <= '2020-05-31' 
        and (istatus <> 'V' or istatus is null)
    group by accountnum
    having min(datein) <> max(datein)
) i on i.accountnum = c.accountnum
1
GMB 26 août 2020 à 22:40

Vous êtes proche, mais pas de JOIN dans la requête externe:

SELECT c.*
FROM Customer C
WHERE (SELECT COUNT(*)
       FROM Invoice
       WHERE C.Accountnum = I.Accountnum AND
            i.Datein >= '2020-03-01' and i.Datein <= '2020-05-31' AND
            (IStatus <> 'V' or IStatus IS NULL)
      ) > 1;

Notez que j'ai également changé la logique de la sous-requête. La sous-requête renvoie un nombre qui est ensuite comparé à 1, plutôt que d'utiliser EXISTS.

1
Gordon Linoff 26 août 2020 à 22:38