Запрос на просмотр всех счетов-фактур для клиентов с несколькими

Вот упрощенная версия двух таблиц:

Invoice ======== InvoiceID CustomerID InvoiceDate TransactionDate InvoiceTotal Customer ========= CustomerID CustomerName 

То, что я хочу, – это список всех счетов-фактур, в которых более одного клиента. Я не хочу группировать или подсчитывать счета-фактуры, мне действительно нужно увидеть все счета-фактуры. Результат будет выглядеть примерно так:

 CustomerName TransactionDate InvoiceTotal ------------------------------------------------- Ted Tester 2012-12-14 335.49 Ted Tester 2013-02-02 602.00 Bob Beta 2013-05-04 779.50 Bob Beta 2013-07-07 69.00 Bob Beta 2013-09-10 849.79 

Каков наилучший способ написать запрос для SQL Server для этого?

Это должно сделать:

 SELECT C.CustomerName, I.TransactionDate, I.InvoiceTotal FROM dbo.Invoice I INNER JOIN dbo.Customer C ON I.CustomerID = C.CustomerID WHERE EXISTS(SELECT 1 FROM Invoice WHERE CustomerID = I.CustomerID GROUP BY CustomerID HAVING COUNT(*) > 1) 

И еще один способ для SQL Server 2005+:

 ;WITH CTE AS ( SELECT C.CustomerName, I.TransactionDate, I.InvoiceTotal, N = COUNT(*) OVER(PARTITION BY I.CustomerID) FROM dbo.Invoice I INNER JOIN dbo.Customer C ON I.CustomerID = C.CustomerID ) SELECT * FROM CTE WHERE N > 1 

Использование оконной функции сделает это очень чистым – это будет поддерживаться SQL Server 2005 и выше:

 SELECT CustomerName, TransactionDate, InvoiceTotal FROM ( SELECT c.CustomerName, i.TransactionDate, i.InvoiceTotal, COUNT(*) OVER (PARTITION BY i.CustomerId) as InvoiceCount FROM Invoice i JOIN Customer c ON i.CustomerId = c.CustomerId ) t WHERE InvoiceCount > 1 

Хорошая старая GROUP BY HAVING в подзапросе с использованием инструкции IN:

 SELECT c2.CustomerName, i2.TransactionDate, i2.InvoiceTotal FROM Invoice i2 INNER JOIN Customer c2 ON i2.CustomerID = c2.CustomerID WHERE i2.CustomerID IN ( SELECT c.CustomerID FROM Customer c INNER JOIN Invoice i on i.CustomerID = c.CustomerID GROUP BY c.CustomerID HAVING COUNT(i.InvoiceID) > 1 ) 
Interesting Posts
Давайте будем гением компьютера.