Я пытаюсь разобраться в различиях между клиентами, выставленными за последние 3 месяца, и всей клиентской базой. Я был в состоянии рассчитывать клиенты, которые были оплаченные с использованием следующего SQLРазница между двумя наборами данных в SQL Server 2000
DECLARE @DateFrom AS DATETIME
SET @DateFrom =
CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) +
'-' +
CAST(MONTH(DATEADD(MONTH, -3, GETDATE())) AS VARCHAR(2)) + '-01', 120)
DECLARE @DateTo AS DATETIME
SET @DateTo =
CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) +
'-' +
CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '-01', 120)
SELECT DISTINCT
i.CustomerCode
FROM
Invoice AS i
WHERE
(i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo)
В таблице, что я буду против сравнения будет таблицы Customer, который также имеет поле CustomerCode.
Заранее благодарен!
EDIT
прошествию веков, пытаясь понять это, и только через несколько минут отправки сообщения здесь я нашел решение. Используя предложение NOT IN!
SELECT
c.CustomerCode
FROM
[Customer] AS c
WHERE
c.CustomerCode NOT IN (
SELECT DISTINCT
i.CustomerCode
FROM
[Invoice] AS i
WHERE
(i.InvoiceDate >= @DateFrom AND i.InvoiceDate < @DateTo))
В моем senario это, как представляется, выполняется быстрее, чем шаги, упомянутые ниже, когда я тестировал каждый в Management Studio.
и что именно вы хотите? Список всех клиентов, которые не были выставлены счета за последние 3 месяца? Какую версию SQL Server вы используете? –
Именно это. Я использую SQL Server 2000. Есть ли лучшее решение для того, которое у меня есть? – Malachi
Нет, я думаю, что в SQL Server 2000 это примерно так же просто, как и получается. –