If statement SQL Server 2005:查找一年内未订购的客户
我试图在SQLServer2005数据库中查找没有任何订单的客户名称,或者要求提供一年的报价。我正在尝试这一点,但它不起作用,因为它只显示超过一年的文档,但如果在当前一年中出现了相同客户的其他文档,也会显示它们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),
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
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()))