2011-11-15 3 views
0

계정 (테이블)가장 좋은 방법은 하나 개의 테이블

+----+----------+----------+-------+ 
| id | account# | supplier | RepID | 
+----+----------+----------+-------+ 
| 1 | 123xyz | Boston |  2 | 
| 2 | 245xyz | Chicago |  2 | 
| 3 | 425xyz | Chicago |  3 | 
+----+----------+----------+-------+ 

지급 (테이블)

+----+----------+----------+-------------+--------+ 
| id | account# | supplier | datecreated | Amount | 
+----+----------+----------+-------------+--------+ 
| 5 | 245xyz | Chicago | 01-15-2009 | 25  | 
| 6 | 123xyz | Boston | 10-15-2011 | 50  | 
| 7 | 123xyz | Boston | 10-15-2011 | -50 | 
| 8 | 123xyz | Boston | 10-15-2011 | 50  | 
| 9 | 425xyz | Chicago | 10-15-2011 | 100 | 
+----+----------+----------+-------------+--------+ 

내가 계정 테이블이 나는 지불금 테이블이에서 * * ​​중복을 포함하여 두 테이블을 조인합니다. 지불금 테이블은 해외에서 제공되므로 우리는이를 통제 할 수 없습니다. 이로 인해 레코드 ID 필드를 기반으로 두 테이블을 조인 할 수 없다는 문제가 있습니다. 이는 해결할 수없는 한 가지 문제입니다. 따라서 Account #, SupplierID (2 및 3 열)를 기반으로 가입합니다. 이것은 (아마도) 많은 관계를 생성하는 문제를 만듭니다. 그러나 우리는 기록이 유효 할 경우 기록을 필터링하고 지불금이 생성되었을 때 지불금 테이블에 두 번째 필터를 사용합니다. 판매 대금은 월 단위로 생성됩니다. 내보기

  1. 쿼리를 완료하는 데 시간이 꽤 걸리는에서이 두 가지 문제 (비효율적 일 수 있음)를 제거하지 않아야 제거 특정 중복있다
  2. 이 있습니다. 판매 대금 테이블에 레코드 6과 8이 예입니다. 여기서 일어난 일은 고객을 확보 한 후 고객이 취소 한 후 다시 돌려받는 것입니다. 이 경우 +50, -50 및 +50. 다시 모든 값은 유효하며 감사 목적으로 보고서에 표시해야합니다. 현재 하나의 +50 만 표시되고 다른 하나는 손실됩니다. 한 번에 오는 보고서에는 몇 가지 다른 문제가 있습니다.

다음은 쿼리입니다. 그룹을 사용하여 중복을 제거합니다. 나는 성과가있는 사전 질의를하고 싶습니다. 그리고 보고서의 달에 나온다면 PayOut 테이블의 어떤 기록도 중복되지 않는다는 사실을 고려합니다. 여기

는 우리의 현재 쿼리

/* Supplied to Store Procedure */ 
----------------------------------- 
@RepID // the person for whome payout is calculated 
@Month // of payment date 
@year // year of payment date 
----------------------------------- 
select distinct 
A.col1, 
A.col2, 
... 
A.col10, 
B.col2, 
B.Col2, 
B.Amount /* this is the important column, portion of which goes to Rep */ 
from records A 
JOIN payout B 
on A.Supplier = B.Supplier AND A.Account# = B.Account# 
where datepart(mm, B.datecreated) = @Month /* parameter to stored procedure */ 
    and datepart(yyyy, B.datecreated) = @Year 
    and A.[rep ID] = @RepID /* parameter to SP */ 
group by 
col1,col2,col3,....col10 
order by customerName 

이 쿼리가 최적이다? CROSS APPLY 또는 WHERE EXISTs를 사용하여 문제를 개선하고 중복 문제를 빨리 제거 할 수 있습니까?

이 쿼리는 담당자의 대금 지급에 사용됩니다. 따라서 모든 레코드는 자신이 할당 된 필드를 repid했습니다. 이상적으로 Select WHERE Exist 쿼리를 사용하고 싶습니다.

+0

선택 영역에 실제 필드를 표시 할 수 있습니까? 어떤 필드가 어떤 테이블에서 가져올지를 아는 것이 적절합니다. – JNK

+1

그리고 실제로 원하는 것은 무엇입니까? '중복'문제가 있지만 _more_ 행 (7 & 8)을 원하고있는 것 같습니다. 현재/원하는 결과 세트를 갖는 것이 도움이됩니다. –

+0

중복 제거 문제가 있습니다. 그들은 제거되지만 그들은 거기에 있어야합니다.나는 실제 쿼리를 게시 할 수없는 것 같습니다. 내 쿼리는 실제 쿼리를 제외하고는 실제 쿼리와 매우 유사합니다. MAX (col1 case statement)가 사용 되었기 때문에 unnesssary입니다. 그리고 그 결과 10 개의 그룹 별 진술이 사용되었습니다. 이 건전한 쿼리를 개선/수정하는 방법은 전문가의 의견을 원합니다. –

답변

0

한 곳에서 중복을 원하지만 '중복 제거'를 위해 그룹을 사용한다고 말하기 때문에 원하는 것을 정확하게 이해하기 어렵습니다. 따라서 첫 번째 생각은 "왜 그룹을 없애지 않는 것입니까?"입니다. 하지만 나는 네가 너 자신을 생각할만큼 똑똑하다는 것을 믿어야한다. 그래서 나는 그것이 이유가 있어야만한다고 생각한다.

난 당신이 실제 쿼리를 게시 할 수 있다면 여기에 누군가가 아주 쉽게 당신을 도울 수 있다고 생각하지만, 당신이 말하는 이후 난 그냥 문제를 해결하는 몇 가지 방향을 제시하려고합니다 수 없습니다 ...

대신 하나의 명령문에서 모든 것을하려고하면 임시 테이블이나 뷰를 사용하여 분할합니다. 원하지 않는 복사본을 없애고 먼저 수행 한 복사본을 유지하고 임시 테이블에 넣은 다음 테이블을 함께 결합하여 작업하는 것이 더 쉬운 방법 일 수 있습니다.

+0

이전 프로그래머는 group by 및 distinct를 사용하여 중복을 제거했습니다. 우리는 질문에 명시된 바와 같이 특정 중복이 필요하다는 것을 발견했습니다. CROSS APPLY를 사용하여 쿼리를 다시 작성했습니다. 나는 여전히 문제를 해결하고 그 결과를 원본과 비교하고있다. 나는 실제적인 질문을 게시하는 것이 일반적인 관행이라고 생각하지 않는다. 또는 내가 그것에 많은 것들을 바꿀 수 있다면. 나가 그것을 할 수없는 경우에, 나는 잘 배치 할지도 모른다. 질문의 또 다른 부분은이 쿼리 사운드가 들리는 것입니다. 그것은 성능 improvment로 더 잘 쓰여질 수 있습니까? –

+0

소리가 좋은지 아닌지는 다소 주관적인 질문입니다. 내 접근 방식은 최상위 쿼리에서 잘못된 데이터를 보상하는 표현식을 사용하지 않으려 고합니다. 즉, 데이터를 필터링/변환하는 쿼리 또는 뷰가있을 수 있습니다. 즉, 데이터가 먼저 있어야하는 것은 아닙니다. 그런 다음 해당 데이터를 쿼리합니다. –

관련 문제