2012-08-02 3 views
1

일부 재무 데이터가 포함 된 팩트 테이블이 있습니다. 값이 "실제"또는 "현재 Outlook"인 항목을 정의하는 열 (VERS_NM)이 있습니다. 이 두 값은 항상 동일해야하지만 일부 보고서에서는 잘못된 것으로 나타났습니다. 그래서 실제 값이 현재 전망과 일치하지 않는 곳을 찾기 위해 쿼리를 작성하고 싶습니다.데이터 유효성 검사 문제에 대한 SQL 쿼리 디자인

이렇게하기 위해 머리를 감쌀 수 없습니다. 그래서 "실제"말할 것이다 VERS_NM 열을 제외한 1 젓는 동일한 행이 될 것입니다 요약하자면 table

: 여기

테이블의 모습입니다. 최소한 실제와 현재 Outlook이 일치하지 않는 경우를 찾고 싶습니다. 어떤 도움이나 아이디어라도 높이 평가합니다. 올바른 방향으로 추진하거나이 문제를 해결하기위한 계획을 세우는 것이 좋습니다.

감사합니다.

+1

여기에 기본 키가 무엇입니까? – stb

답변

4

당신은 자기 데이터를 결합 단지 수 a, b, c, d 필드를 행이 동등한 필드로 바꾸십시오.

SELECT 
    * 
FROM 
    yourTable AS actual 
INNER JOIN 
    yourTable AS outlook 
    ON actual.a = outlook.a 
    AND actual.b = outlook.b 
    AND actual.c = outlook.c 
    AND actual.d = outlook.d 
WHERE 
     actual.VERS_NM = 'Actual' 
    AND outlook.VERS_NM = 'Current Outlook' 
    AND actual.FINC_ACCT_METRIC_VAL <> outlook.FINC_ACCT_METRIC_VAL 
+0

이것은 유망 해 보입니다. 어떻게 작동하는지 알려 드리겠습니다. 감사! – tarheels058

+0

매력처럼 작동했습니다. 귀하의 의견을 다시 한번 감사드립니다! – tarheels058

0

당신은 group by 다른 모든 열은 다음 각 그룹이 "실제"이 있고 "현재 전망"변종 것을 요구하는 having 절을 사용할 수 있습니다

select * 
from YourTable 
group by 
     col1 
,  col2 
,  ... all other columns ... 
having sum(case when VERS_NM = 'Actual' then 1 end) <> 1 
     or sum(case when VERS_NM = 'Current Outlook' then 1 end) <> 1 
     or count(*) <> 2 
+0

재미있는'having' 절! – stb

+0

OP는 두 개의 일치하는 행 (하나의 실제, 하나의 Outlook)이 있지만 다른 값이있는 결과를 원합니다. – MatBailie

1

다른 방법은 UNION를 사용하는 것입니다. 그것은 많은 테이블 필드의 차이를 감지하는 더 많은 방법이지만, 상황에서도 잘 작동 할 수 있습니다.

이 기술은 별도의 두 테이블을 비교하기 위해 The shortest, fastest, and easiest way to compare two tables in SQL Server: UNION! 문서에 설명되어 있지만 단일 테이블을 분석 할 수 있습니다.

COL1, COL2 등의 필드를 비교하려는 열로 바꿉니다. 비교를 위해절을 내부 SELECT에 추가하여 두 개의 별도 테이블로 데이터를 효과적으로 볼 수 있습니다.

SELECT MIN(TableName) as TableName, ID, COL1, COL2, COL3 ... 
FROM 
(
    SELECT 'Actual' as TableName, A.ID, A.COL1, A.COL2, A.COL3, ... 
    FROM Finance_Data A 
    WHERE VERS_NM = 'Actual' 
    UNION ALL 
    SELECT 'Outlook' as TableName, B.ID, B.COL1, B.COl2, B.COL3, ... 
    FROM Finance_Data B 
    WHERE VERS_NM = 'Current Outlook' 
) T 
GROUP BY ID, COL1, COL2, COL3 ... 
HAVING COUNT(*) = 1 
ORDER BY ID