2011-02-17 5 views
0

이것이 사실 SQL (MS SQL 2005 사용)에서 가능한지 확실하지 않지만 매주 업데이트되는 고객 트랜잭션의 요약 테이블을 만드는 것이 좋습니다. 이것의 단순화 된 버전은 다음과 같이 보일 것이다 : 내 테이블 내에서특정 저장 프로 시저가 마지막으로 실행 된 이후 새 데이터가 있으면 레코드를 업데이트 하시겠습니까?

+-----------------+----------------+----------------+----------------+----------------+ 
+ Customer_id + 2007 purchases + 2008 purchases + 2009 purchases + 2010 purchases + 
+-----------------+----------------+----------------+----------------+----------------+ 
+ id_001  +  0  +  7  +  10  +  50  + 
+-----------------+----------------+----------------+----------------+----------------+ 
+ id_002  +  0  +  0  +  5  +  20  + 
+-----------------+----------------+----------------+----------------+----------------+ 
+ id_003  +  100  +  0  +  0  +  0  + 
+-----------------+----------------+----------------+----------------+----------------+ 

나는 그래서 자신의 데이터가 지난 주 내에서 변경되지 않은 경우 매주이 다시하고 싶지 않아 약 7 만 명의 고객이있다.

저장 프로 시저가 마지막으로 실행 된 이후 고객의 구매 데이터가 변경되었는지 여부를 결정하고 싶습니다. (따라서이 명명 된 프로 시저를 실행 한 이후 새로운 구매가 있었던 경우에만 관심이 있습니다. 다른 모든 항목은 무시). 그런 다음 해당 고객에게만 update 문을 적용하십시오.

내가 필터로이 적용 같은 일을의 라인을 따라 생각하고 있었다 :

WHERE EXISTS (SELECT customer_id 
FROM purchases WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, purchase_date)) > DATEADD(dd, -8, DATEDIFF(dd, 0, getdate())) 

는 지난 주 내에서 새로운 구매를 데리러하지만, 저장 프로 시저 변화의 주파수가이 필요한 경우 또한 변경 될 수 있으므로 저장 프로 시저의 마지막 발생 이후 업데이트 된 레코드 만 필터링하면 가장 좋습니다.

감사합니다.

실제 테이블 구조 -

CREATE TABLE 
(
id UNIQUEIDENTIFIER 
,customer_id NVARCHAR(255) 
,date_received DATETIME 
,value DECIMAL(18,3) 
) 

그래서 내가 (잘 작동) 위의 샘플 테이블의 각 고객에 대해 매년 정보를 포함하는 피벗 쿼리에 어떤 양을 사용하고 부분입니다 단순화 더 복잡한 쿼리가 필요합니다. 쿼리는 모든 고객에게 적용될 때 상당히 느립니다. 따라서 출력이 이미 테이블에있는 것과 다를 경우 저장 프로 시저 내에서만 실행하는 방법을 근본적으로 찾고 있습니다!

+0

실제 구조를 포함하는 것이 좋습니다. 당신의 쿼리는 당신이 준 테이블 구조에 전혀 관계가 없습니다 ... – JNK

답변

2

보고서를 실행 한 날짜를 저장하지 않는 이유는 무엇입니까? 그런 식으로 쿼리를 변경하지 않아도됩니다. 단지 '오늘'과 저장된 프로 시저가 마지막으로 실행 된 시간의 차이를 가져옵니다.

편집 보고서를 실행할 때 단순히 날짜를 저장하는 데이터베이스에 다른 테이블을 추가합니다. 보고서를 요청하는 코드 또는 보고서를 생성하는 저장 프로 시저에서이 테이블을 채울 수 있습니다. 그러나 보고서 실행의 전체 기록이 필요하지 않을 수 있으므로 보고서가 실행 된 마지막 날짜 만 저장하면 문제가 없어 질 수 있습니다. 이렇게하면 분명히 데이터베이스 공간을 절약 할 수 있습니다.

+0

어떻게하면 갈 수 있습니까? – Dibstar

+1

보고서 테이블 또는 연결된 '보고서 머리글'테이블에 실행 날짜를 저장합니다. SP에서 실행 날짜를 업데이트하십시오. – DaveE

+0

@Davin : 또는 원하는 경우 고객 표에 표시됩니다. 원하는 경우 사용자 당 요약을 새로 고칠 수 있습니다. 예약 된 보고서 새로 고침은 다양한 범위를 사용하여 모든 사용자의 업데이트를 확인합니다. 당연히 두통이 더 심하며, 실제로 그것에 큰 도움이되는지 확신 할 수 없습니다. (요약 새로 고침을 위해 선택해야하는 행 수를 줄이는 방법을 생각해 보았습니다.) 나중에 다른 무거운 보고서를 볼 기회가있는 경우 날짜를 저장하는 전용 테이블을 사용하는 것이 더 좋습니다. –

관련 문제