계정 (테이블)가장 좋은 방법은 하나 개의 테이블
+----+----------+----------+-------+
| 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 열)를 기반으로 가입합니다. 이것은 (아마도) 많은 관계를 생성하는 문제를 만듭니다. 그러나 우리는 기록이 유효 할 경우 기록을 필터링하고 지불금이 생성되었을 때 지불금 테이블에 두 번째 필터를 사용합니다. 판매 대금은 월 단위로 생성됩니다. 내보기
- 쿼리를 완료하는 데 시간이 꽤 걸리는에서이 두 가지 문제 (비효율적 일 수 있음)를 제거하지 않아야 제거 특정 중복있다
- 이 있습니다. 판매 대금 테이블에 레코드 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 쿼리를 사용하고 싶습니다.
선택 영역에 실제 필드를 표시 할 수 있습니까? 어떤 필드가 어떤 테이블에서 가져올지를 아는 것이 적절합니다. – JNK
그리고 실제로 원하는 것은 무엇입니까? '중복'문제가 있지만 _more_ 행 (7 & 8)을 원하고있는 것 같습니다. 현재/원하는 결과 세트를 갖는 것이 도움이됩니다. –
중복 제거 문제가 있습니다. 그들은 제거되지만 그들은 거기에 있어야합니다.나는 실제 쿼리를 게시 할 수없는 것 같습니다. 내 쿼리는 실제 쿼리를 제외하고는 실제 쿼리와 매우 유사합니다. MAX (col1 case statement)가 사용 되었기 때문에 unnesssary입니다. 그리고 그 결과 10 개의 그룹 별 진술이 사용되었습니다. 이 건전한 쿼리를 개선/수정하는 방법은 전문가의 의견을 원합니다. –