2013-06-26 1 views
1

두 데이터베이스 (MS SQL Server)가 있습니다. 하나는 현재보고 표 집합을 포함하고 다른 하나는 지난 주 보고서 표 집합을 사용합니다. 매주 나는 주 단위에서 주 단위로 행 계수가 다를 수 있음) 이전 주에 모든 조치를 비교하고 QTD와 YTD가 증가하는지 확인하고 싶습니다. 행에 대한 순서는 매주 다를 수 있으므로 함께가는 것은 무엇이든 고려해야합니다.QA 내역 데이터에 대한 SQL 테이블

또 다른 고려 사항은이 테이블 중 50 개를 비교할 것이므로 수동으로 수행하는 것이 옵션이 될 수 없다는 것입니다. 지난 주보다 YTD가 더 높은 값이있을 때와 마찬가지로 일종의 오류 로그를 갖는 것도 좋습니다.

현재 주

+-------+------------+--------+ 
| Item | TimePeriod | Number | 
+-------+------------+--------+ 
| Pigs | QTD  |  28 | 
| Pigs | YTD  |  86 | 
| Cows | QTD  |  7 | 
| Cows | YTD  |  9 | 
| Bears | QTD  |  67 | 
| Bears | YTD  | 132 | 
+-------+------------+--------+ 

지난 주

+-------+------------+--------+ 
| Item | TimePeriod | Number | 
+-------+------------+--------+ 
| Bears | QTD  |  55 | 
| Bears | YTD  | 120 | 
| Pigs | QTD  |  22 | 
| Pigs | YTD  |  80 | 
| Cows | QTD  |  5 | 
| Cows | YTD  |  10 | 
+-------+------------+--------+ 

오류

오류 : 소 YTD 현재 주-9 이전 주-10

+0

원하는 결과가 오류 로그입니까? 매주 DB 이름이 변경되거나 "CurrentDB"및 "PreviousDB"이름이 항상 일치합니까? 50 개의 테이블이 모두 무엇인지 어떻게 알 수 있습니까? 이름이 일치하는 패턴이 있습니까? –

+0

예, 원하는 결과는 오류 로그입니다. 현재 DB 이름은 변경되지 않으며 이전 DB는 마지막 주 날짜가 끝에 추가 된 현재 DB입니다. 우리는 50 개의 테이블을 모두 알고 있습니다. 이름이 일치하는 패턴에 대한 마지막 질문에 대해 확실하지 않습니다. 명확하게 할 수 있습니까? – dvoery

+0

@dvoery 원하는 로그 출력 :'Error : Cows YTD Current Week-9 Prev Week-10''-9'와'-10'은 무엇을 상징합니까? 테이블 이름의 일부입니까, 아니면'Number' 필드입니까? – jpw

답변

1

어쩌면 같은 것을 할 것입니다 :

SELECT 'Error ' + CW.TimePeriod + ' Current week:' + CAST(CW.Number AS VARCHAR) + ' Prev week:' + CAST(PW.Number AS VARCHAR) 
FROM [Current Week DB].Table CW 
INNER JOIN [Previous DB].Table PW ON 
    CW.ITEM=PW.ITEM 
    AND CW.TIMEPERIOD=PW.TIMEPERIOD 
    AND CW.Number=PW.Number 

모든 열에 가입하면 테이블간에 변경되지 않은 행이 제공됩니다. 테이블에 대한 식별자는 분명히 변경되어야합니다.

+0

테이블 이름은 동일하며 데이터베이스를 통해 조인해야합니다. –

+0

아, 질문을 잘못 읽었습니다 ... 올바른 데이터베이스로 테이블을 가리킨 후에 논리가 소리가 나지 않아야합니까? – jpw

+0

내부 조인을 할 수 없다는 점을 제외하면 각 테이블에 같은 수의 행이 없으므로 외부 조인을해야합니다. 나는 현재가 이전보다 더 많은 것을 가질 수 있다고 가정한다. –

0

다중 데이터베이스 또는 여러 테이블을 사용하는 것이 정당하지 않습니다.

대신에 이와 같은 표를 사용하는 것이 좋습니다. 당신은 SQL 서버 2012

select 
    item, timeperiod, weeknum, number, 
    number - lead (number) 
      over (partition by item, timeperiod 
         order by item, timeperiod, weeknum desc) as change 
from table1; 

ITEM TIMEPERIOD WEEKNUM NUMBER CHANGE 
-- 
Bears QTD   2013-26 67  12 
Bears QTD   2013-25 55  (null) 
Bears YTD   2013-26 132  12 
Bears YTD   2013-25 120  (null) 
Cows QTD   2013-26 7  2 
Cows QTD   2013-25 5  (null) 
Cows YTD   2013-26 9  -1 
Cows YTD   2013-25 10  (null) 
Pigs QTD   2013-26 28  6 
Pigs QTD   2013-25 22  (null) 
Pigs YTD   2013-26 86  6 
Pigs YTD   2013-25 80  (null) 

당신이 부정적인 변화가있는 경우에만 해당 행을 원하는 경우로 이전 쿼리를 사용하는 경우

ITEM  TIMEPERIOD WEEKNUM  NUMBER 
Bears QTD   2013-26  67 
Bears QTD   2013-25  55 
Bears YTD   2013-26  132 
Bears YTD   2013-25  120 
Cows  QTD   2013-26  7 
Cows  QTD   2013-25  5 
Cows  YTD   2013-26  9 
Cows  YTD   2013-25  10 
Pigs  QTD   2013-26  28 
Pigs  QTD   2013-25  22 
Pigs  YTD   2013-26  86 
Pigs  YTD   2013-25  80 

그런 다음 필수 쿼리 상대적으로 단순하고 간단합니다 파생 테이블을 만들고 WHERE 절을 추가하십시오.

select * 
from 
    (select 
     item, timeperiod, weeknum, number, 
     number - lead (number) 
       over (partition by item, timeperiod 
         order by item, timeperiod, weeknum desc) as change 
    from table1) t 
where change < 0 
    and timeperiod = 'YTD'; 

ITEM TIMEPERIOD WEEKNUM NUMBER CHANGE 
-- 
Cows YTD   2013-26 9  -1 
+1

성능상의 이유로 또는 이전 레코드를 다른 저장소로 이동하기 위해 파티션을 분할 할 필요는 없습니다. DB는 우리가 알고있는 모든 것에 대해 수십억 개의 행을 보유 할 수 있습니다. – jpw

+0

@jpw : 고마워요. 나는 내 언어를 중재했다. –