If statement SQL Server 2005:查找一年内未订购的客户

If statement SQL Server 2005:查找一年内未订购的客户,if-statement,sql-server-2005,If Statement,Sql Server 2005,我试图在SQLServer2005数据库中查找没有任何订单的客户名称,或者要求提供一年的报价。我正在尝试这一点,但它不起作用,因为它只显示超过一年的文档,但如果在当前一年中出现了相同客户的其他文档,也会显示它们 SELECT DISTINCT ANAGRAFICACF.CODCONTO, DSCCONTO1, '€ '+LEFT(TOTDOCUMENTO,LEN(TOTDOCUMENTO)-2), CONVERT(VARCHAR(11),DATADOC,6),

我试图在SQLServer2005数据库中查找没有任何订单的客户名称,或者要求提供一年的报价。我正在尝试这一点,但它不起作用,因为它只显示超过一年的文档,但如果在当前一年中出现了相同客户的其他文档,也会显示它们

SELECT DISTINCT 
    ANAGRAFICACF.CODCONTO,
    DSCCONTO1,
    '€ '+LEFT(TOTDOCUMENTO,LEN(TOTDOCUMENTO)-2),
    CONVERT(VARCHAR(11),DATADOC,6),
    TESTEDOCUMENTI.TIPODOC,
    ANAGRAFICACF.PARTITAIVA,
    ANAGRAFICACF.CODFISCALE,
    ANAGRAFICARISERVATICF.NOTE1,
    TESTEDOCUMENTI.DATADOC,
    TESTEDOCUMENTI.CODAGENTE1,
    ANAGRAFICAAGENTI.DSCAGENTE 
FROM
    dbo.TESTEDOCUMENTI 
INNER JOIN 
    dbo.ANAGRAFICACF ON CODCLIFOR = CODCONTO
INNER JOIN 
    dbo.RIGHEDOCUMENTI ON PROGRESSIVO = IDTESTA AND TOTNETTORIGA <> '0'
INNER JOIN 
    dbo.ANAGRAFICARISERVATICF ON CODCLIFOR = ANAGRAFICARISERVATICF.CODCONTO
LEFT JOIN 
    dbo.ANAGRAFICAAGENTI ON CODAGENTE = TESTEDOCUMENTI.CODAGENTE1
WHERE  
    (dbo.TESTEDOCUMENTI.TIPODOC = 'ORDER' OR
     dbo.TESTEDOCUMENTI.TIPODOC = 'QUOTATION') 
    AND (dbo.TESTEDOCUMENTI.DATADOC < DATEADD(DAY, -365, GETDATE()) 

ORDER BY 
    TESTEDOCUMENTI.DATADOC DESC
解决方案谢谢@scsimon 将此where条件添加到NOT IN中:

    WHERE      dbo.TESTEDOCUMENTI.TIPODOC = 'FVC' AND dbo.TESTEDOCUMENTI.DATADOC < DATEADD(DAY, -365, GETDATE()) 
               AND TESTEDOCUMENTI.CODCLIFOR NOT IN (SELECT DISTINCT TESTEDOCUMENTI.CODCLIFOR
                    FROM dbo.TESTEDOCUMENTI  
                    WHERE dbo.TESTEDOCUMENTI.TIPODOC = 'FVC' AND dbo.TESTEDOCUMENTI.DATADOC > DATEADD(DAY, -365, GETDATE())
                    )

Hope this will help, if someone else will have my request. 
您要使用的文件不存在。如果ANAGRAFICACF.CODCONTO是您的客户编号,则以下内容适用于您。因为您的列名不是很自解释的,所以如果我不正确,请将它们更改为您需要的名称。但是,不存在的逻辑是你想要的

删除:

加:

样本数据

单击以运行此代码

IF OBJECT_ID('tempdb..#agents') IS NOT NULL DROP TABLE #agents
IF OBJECT_ID('tempdb..#items') IS NOT NULL DROP TABLE #items

create table #agents (AgentID varchar(2), name varchar(50))
insert into #agents values
('A1','Julius Cesar'),
('B2','Albert Einstien'),
('C3','Frank Thomas')


create table #items (AgentID varchar(2), ItemID int, ItemName varchar(50), DT datetime)
insert into #items (AgentID, ItemID, ItemName, DT) values
--Notice Juliues Cesar has items in the current year, AND older than a year
('A1',1,'Apple','7/1/2015'),
('A1',2,'Pear','7/1/2016'),
('A1',3,'Watermelon','12/1/2015'),
('A1',4,'Grape','1/1/2015'),

--Notice Albert Einstien only has items older than a year

('B2',5,'Car','7/1/2015'),
('B2',6,'Truck','5/1/2015'),
('B2',7,'Van','3/1/2015'),

--Notice Frank Thomas only has items older than a year
('C3',8,'Car','7/1/2014'),
('C3',9,'Truck','5/1/2014'),
('C3',10,'Van','3/1/2014')


Select 
    a.name
    ,i.* 
from 
    #items i
    inner join #agents a on 
    a.AgentID = i.AgentID
where
    --Items that are older than a year
    DT < DATEADD(DAY, -365, GETDATE())
    AND i.AgentID NOT IN (select distinct AgentID from #items where dt > DATEADD(DAY, -365, GETDATE()))

你的最后一个where子句似乎无关紧要。当你移除它时会发生什么是不相关的。我获得了相同的结果,但仍然是错误的结果,因为我获得了一个客户的名称,该客户在今年也有订单。我需要排除它们。订单日期是否仅基于dbo.TESTEDOCUMENTI.DATADOC是的,并且至少基于交货日期,但我认为使用它没有什么用处。然后仅使用和dbo.TESTEDOCUMENTI.DATADOC查询,另一次是<,我也会看到不同的客户代码。但是当我使用notexist时,结果是黑色的。还有另一个逗号用于排除结果?@BigBlack我给了你另一种使用NOT IN的方法。我还提供了一个示例数据集。这应该解决你的问题,所以考虑投票和接受它,以及我为你解决的另一个问题。
AND NOT dbo.TESTEDOCUMENTI.DATADOC BETWEEN DATEADD(DAY, -365, GETDATE() ) AND GETDATE())
AND ANAGRAFICACF.CODCONTO NOT IN 
                (SELECT DISTINCTANAGRAFICACF.CODCONTO 
                FROM dbo.ANAGRAFICACF
                INNER JOIN
                  dbo.TESTEDOCUMENTI ON CODCLIFOR = CODCONTO
                WHERE 
                  dbo.TESTEDOCUMENTI.DATADOC > DATEADD(DAY, -365, GETDATE()))
IF OBJECT_ID('tempdb..#agents') IS NOT NULL DROP TABLE #agents
IF OBJECT_ID('tempdb..#items') IS NOT NULL DROP TABLE #items

create table #agents (AgentID varchar(2), name varchar(50))
insert into #agents values
('A1','Julius Cesar'),
('B2','Albert Einstien'),
('C3','Frank Thomas')


create table #items (AgentID varchar(2), ItemID int, ItemName varchar(50), DT datetime)
insert into #items (AgentID, ItemID, ItemName, DT) values
--Notice Juliues Cesar has items in the current year, AND older than a year
('A1',1,'Apple','7/1/2015'),
('A1',2,'Pear','7/1/2016'),
('A1',3,'Watermelon','12/1/2015'),
('A1',4,'Grape','1/1/2015'),

--Notice Albert Einstien only has items older than a year

('B2',5,'Car','7/1/2015'),
('B2',6,'Truck','5/1/2015'),
('B2',7,'Van','3/1/2015'),

--Notice Frank Thomas only has items older than a year
('C3',8,'Car','7/1/2014'),
('C3',9,'Truck','5/1/2014'),
('C3',10,'Van','3/1/2014')


Select 
    a.name
    ,i.* 
from 
    #items i
    inner join #agents a on 
    a.AgentID = i.AgentID
where
    --Items that are older than a year
    DT < DATEADD(DAY, -365, GETDATE())
    AND i.AgentID NOT IN (select distinct AgentID from #items where dt > DATEADD(DAY, -365, GETDATE()))