Select 具有完整客户记录的内部连接不同

Select Distinct in inner join with full customer record

我有两个 table,一个与客户有关,另一个与发票有关。我需要找到在一个时期内拥有多于一张不同日期发票的所有客户。

发票table: 账号 椰枣 状态 ...

客户table: 账号 ...

我有两个问题:

1: 我可以得到有多个发票的客户,但我不知道如何检查它们是否不同。

2: 客户在此查询中显示了多次,他们只需要显示一次。

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)

你很接近,但在外部查询中没有 JOIN:

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;

请注意,我还更改了子查询的逻辑。子查询 returns 一个计数,然后与 1 进行比较,而不是使用 EXISTS.

检查给定客户是否有两个不同日期的发票的一种简单方法是确保最短发票日期与最长发票日期不同。您可以将其编写为 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