2009-12-03 6 views
2

"상태"기간 항목의 합계를 반환하는 쿼리가 있습니다. 지속 시간은 datediff를 사용하여 계산됩니다 (n, datestamp, (현재 상태를 끝내는 날짜 기록을 반환하는 하위 쿼리, 즉 잠긴 후 다음 피팅 "상태 변경"- 항목을 찾습니다)하위 쿼리 내에서 다중 부분 식별자 문제가있는 SQL 쿼리

내 문제는 다음과 같습니다. 쿼리는 여러 부분으로 구성된 식별자 오류를

  • INC 테이블이 나에게 "INCIDENT_NUMBER"을주고있다 내가 다른 테이블에서 "번호"와 관련이 느릅 나무를 찾고 있어요
  • ACTM1가 보유하고있는 모든 DATESTAMP-을 반환 항목
  • ACTA1은 "THENU MBER "그것은 항목은 피팅 상태 변경인지 아닌지에 대한 모든 정보를 보유하고

코드 :

SELECT SUM(DATEDIFF(n, ACTM1.DATESTAMP, END_DATESTAMP_TABLE.END_DATESTAMP)) 
FROM INC    LEFT OUTER JOIN 
    ACTM1 ON INC.INCIDENT_NUMBER = ACTM1.NUMBER LEFT OUTER JOIN 
    ACTA1 ON ACTM1.THENUMBER = ACTA1.THENUMBER LEFT OUTER JOIN 
/**/ 
    (SELECT ACTM1_1.NUMBER, ACTM1_1.DATESTAMP AS END_DATESTAMP 
    FROM ACTM1 AS ACTM1_1    LEFT OUTER JOIN 
/**/ 
     (SELECT ACTM1_1_1.NUMBER, MIN(ACTM1_1_1.THENUMBER) AS FOLLOWUP_THENUMBER 
    FROM ACTM1 AS ACTM1_1_1 
    WHERE (ACTM1_1_1.THENUMBER > /**/ ACTM1_1.THENUMBER)/*I think here lies the problem*/ 
     AND (ACTM1_1_1.[TYPE] IN ('Open', 'Status Change', 'Resolved', 'Closed'))) 
    AS FOLLOWUP_THENUMBER_TABLE 
/**/ 
      ON ACTM1_1.NUMBER = FOLLOWUP_THENUMBER_TABLE.NUMBER) 
    AS END_DATESTAMP_TABLE 
/**/ 
      ON ACTM1.NUMBER = END_DATESTAMP_TABLE.NUMBER 
WHERE ... 

내가 어떤 도움이 의견에 대한 감사 또는 당신이 날 줄 수있는 힌트 것 ,

PS

답변

2

좌측 우측을 참조 할 수없는 관계에 참여하므로이 불법 :

,114 적용 연산자 대신

사용 : 귀하의 경우

SELECT ... 
FROM A 
APPLY (SELECT ...FROM ... WHERE ... = A.Field AND ID = A.ID) AS B; 

아마 다음과 같이 될 것이다 : 내부 쿼리 내부

SELECT SUM(DATEDIFF(n, ACTM1.DATESTAMP, END_DATESTAMP_TABLE.END_DATESTAMP)) 
FROM INC     
LEFT OUTER JOIN ACTM1 ON INC.INCIDENT_NUMBER = ACTM1.NUMBER 
LEFT OUTER JOIN ACTA1 ON ACTM1.THENUMBER = ACTA1.THENUMBER 
LEFT OUTER JOIN (
    SELECT ACTM1_1.NUMBER, ACTM1_1.DATESTAMP AS END_DATESTAMP 
    FROM ACTM1 AS ACTM1_1 
    OUTER APPLY (
     SELECT ACTM1_1_1.NUMBER, /* MIN(ACTM1_1_1.THENUMBER) */ AS FOLLOWUP_THENUMBER 
     FROM ACTM1 AS ACTM1_1_1 
     WHERE (ACTM1_1_1.THENUMBER > ACTM1_1.THENUMBER) 
     AND (ACTM1_1.NUMBER = FOLLOWUP_THENUMBER_TABLE.NUMBER) 
     AND (ACTM1_1_1.[TYPE] IN ('Open', 'Status Change', 'Resolved', 'Closed')) 
    ) AS FOLLOWUP_THENUMBER_TABLE 
) AS END_DATESTAMP_TABLE ON ACTM1.NUMBER = END_DATESTAMP_TABLE.NUMBER 

분명히 MIN 그래도 이해되지 않는다.

+0

실제로 말이됩니다. 때로는 하나 이상의 "피팅"상태 변경 항목이 있습니다. 그 항목은 시간순으로 "THENUMBER"로 정렬됩니다. 어쨌든 도움을 주셔서 감사합니다. – Per

+0

비즈니스 측면에서 볼 때 나는 아니지만 SQL 관점에서 볼 때 그렇습니다. group by 절과 함께 집계되지 않은 필드 (예 : ACTM1_1_1.Number)와 결합 된 집계 함수를 가질 수 없습니다. –

+0

아마도 ('TOP (1) NUMBER, THENUMBER ... THENUMBER ASC에 의해 주문하십시오. ') –

1

나는 전혀 하위 쿼리를 사용하지 않는 쿼리를 다시 작성합니다 :

SELECT 
    SUM(DATEDIFF(n, A1.datestamp, A2.datestamp)) 

FROM 
    INC AS I 
INNER JOIN ACTM1 AS A1 ON 
    A1.number = INC.incident_number 
INNER JOIN ACTM1 AS A2 ON 
    A2.number > A1.number AND 
    A2.type IN ('Open', 'Status Change', 'Resolved', 'Closed') 
LEFT OUTER JOIN ACTM1 AS A3 ON 
    A3.number > A1.number AND 
    A3.type IN ('Open', 'Status Change', 'Resolved', 'Closed') AND 
    A3.number < A2.number 
WHERE 
    A3.number IS NULL 

내가 완전히 반대로 당신의 문을 설계 할 수 없습니다. 왼쪽 조인이 필요한지 아닌지는 모르겠지만 ACTA1이 실제로 사용 된 곳을 보지 못했습니다. 그래서 그것을 버렸습니다. 결과적으로 위의 내용을 조정해야 할 수도 있습니다. 일반적인 생각은 더 많은 수의 행을 찾고 필요한 유형이 있지만 올바른 유형의 다른 행 (A3)과 두 숫자 사이에있는 숫자가없는 행을 찾는 것입니다.

+0

감사합니다. Tom, 나는 당신의 접근 방식을 작동 시키려고 노력할 것입니다. ACTA1은 나중에 사용됩니다. 비슷한 쿼리가 처음에 SUM없이 작동하는 경우. ACTA1이 어디서 왔는지. 이 쿼리를 사용하는 보고서는 나중에 요약합니다. 하지만 내 현재 보고서는 이런 식으로 작동하지 않습니다 ... 그래서 내 쿼리 내에서 SUM 필요했습니다. – Per