2016-08-01 3 views
1

SQL Server 2005 데이터베이스에서 주문이없는 고객 이름을 찾으려고하거나 1 년간의 견적을 요청하고 있습니다. 나는 이것을 시도하고 있지만 작동하지 않는다. 왜냐하면 그것은 나에게 1 년 이상 된 문서만을 보여주기 때문이다. 그러나, 같은 해의 다른 문서가 선물 인 경우에도 그것들을 보여준다.SQL Server 2005 : 1 년이 지나도 주문하지 않는 고객 찾기

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을 부탁드립니다)

CODCONTO | DSCCONTO1 | TOTDOCUMENTO| DATADOC | TIPODOC| CODAGENTE| DSCAGENTE| 
---------+-----------+-------------+---------+--------+----------+----------+ 
C 10395 |CAIO|€ 1048.22 |03 Aug 15 |ORC |2015-08-03 00:00:00.000 |A  4 |F 
C 51282 |SEMPRONIO|€ 2217.41 |03 Aug 15 |PCL |2015-08-03 00:00:00.000  |NULL 
C 10120 |PINCO |€ 689.54 |03 Aug 15 |PCL |2015-08-03 00:00:00.000 |A  4 |F 
C 746 |TIZIO |€ 205.45 |03 Aug 15 |ORC |2015-08-03 00:00:00.000 |A  4 |F 

솔루션입니다 어디 NOT IN과 조건 :

당신은 NOT EXISTS를 사용하려면
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. 
+0

마지막 where 절은 부적절한 것처럼 보입니다. 제거 할 때 발생하는 문제 – scsimon

+0

예는 부적절합니다. 나는 현재 연도에도 주문이있는 고객의 이름을 얻었 기 때문에 동일한 결과를 얻지 만 여전히 잘못된 결과를 얻습니다. 나는 그들을 배제 할 필요가있다. – BigBlack

+0

주문 날짜는 dbo.TESTEDOCUMENTI.DATADOC – scsimon

답변

1

. ANAGRAFICACF.CODCONTO이 CustomerNumber이면 아래가 적합합니다. 열 이름이 그다지 자명하지 않기 때문에 내가 틀렸다면 필요에 맞게 변경하십시오. 그러나, NOT EXISTS의 논리는 당신이 원하는 것입니다.

제거

AND NOT dbo.TESTEDOCUMENTI.DATADOC BETWEEN DATEADD(DAY, -365, GETDATE()) AND GETDATE()) 

ADD :

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())) 

샘플 데이터

이 코드를 실행하기를 클릭 HERE

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())) 
+0

올바른 방법 일 수 있지만 흰색 쿼리 결과를 얻을 수 있습니다. 나는 이유를 이해하지 못한다 ... – BigBlack

+0

하위 쿼리를 시도하면 결과가 나타난다. BigBlack

+0

원시 데이터는 보이지 않지만 문제 해결이 어렵지만 사용하려는 방법입니다. – scsimon