2015-02-02 3 views
0

동일한보기에서 두 열의 중앙값을 계산하려는 경우 열 PtAPtC을 호출합니다. 데이터의 특성상, PtANULL 일 때 행은 중앙값 계산에 포함되지 않아야합니다. 그러나 이 아닌이 경우는 NULL이 아니므로 PtC의 경우입니다. PtAPtC이 모두 NOT NULL 인 경우 이들을 결합해야합니다. 그러나 PtANULL이지만 PtCNOT NULL이면 필드는 PtC으로 표시되어야하고 PtA 열에는 NULL 값이 삽입되어야합니다.SQL 두 테이블을 결합하거나 결합 하시겠습니까?

저는이 실행의 이론을 이해하는 데 어려움을 겪고 있습니다. 현재 WITH 문을 사용하여 하나의 테이블에 모든 PtA 관련 데이터가있는 두 테이블을 가져오고 다른 테이블에는 모두 PtC 데이터를 가져옵니다.

PtA- 및 PtC- 관련 테이블에서 IUNION ALL을 사용하면 모든 데이터가 캡처되지만 분명히해야 할 필드를 결합하지 않아도됩니다. 위에 제한된대로이 데이터를 "조인/병합"하는 방법이 있습니까? 나는 테이블을 JOIN 때 제대로 데이터의 전체 범위를 캡처 테이블을 조인하기에 더 ID가 없기 때문에

PtA 테이블에 존재하지 않는 어떤 PtC 관련 항목은 존재하지 않을 것입니다.

편집 : 옆 효율성의 UNION ALL에 포착되는 관련 데이터 JOIN 단순히 방법은 아직 PtA에 존재하지 않는 모든 PtC 데이터를 유지하면서 그 결과 테이블은 모든 데이터를 포함하고 같이가?

편집 : 다음은 상황/결과가 어떻게 보이는지에 대한 도표입니다.

UNION ALL Result     
DepartmentName MonthNumber CallType PtAMedian PtCMedian 
Place 1   2   Type 1  8   NULL 
Place 2   2   Type 2  NULL  9 
Place 1   2   Type 1  NULL  54 

Ideal Outcome    
DepartmentName MonthNumber CallType PtAMedian PtCMedian 
Place 1   2   Type 1  8   54 
Place 2   2   Type 2  NULL  9 

------ 

PtA (in this case) 
DepartmentName MonthNumber CallType PtAMedian PtCMedian 
Place 1   2   Type 1  8   NULL 

PtC (in this case) 
DepartmentName MonthNumber CallType PtAMedian PtCMedian 
Place 2   2   Type 2  NULL  9 
Place 1   2   Type 1  NULL  54 

UNION ALL 층 실제로 중앙값을 산출하는 SELECT 문장을 갖는다. 여기에 문장은 :

SELECT 
DepartmentName, 
MonthNumber, 
CallType, 
CONVERT(DECIMAL(10,2), SUM(PtA)/CONVERT(DECIMAL(10,2), COUNT(PtA))) AS  PtAMedian, 
NULL AS PtCMedian 
FROM 
rawDataPtA 
WHERE 
RowNumberASC IN (RowNumberDESC, RowNumberDESC - 1, RowNumberDESC + 1) 
GROUP BY DepartmentName, MonthNumber, CallType 

UNION ALL 

SELECT 
DepartmentName, 
MonthNumber, 
CallType, 
NULL AS PtAMedian, 
CONVERT(DECIMAL(10,2), SUM(PtC)/CONVERT(DECIMAL(10,2), COUNT(PtC))) AS PtCMedian 
FROM 
rawDataPtC 
WHERE 
RowNumberASC IN (RowNumberDESC, RowNumberDESC - 1, RowNumberDESC + 1) 
GROUP BY DepartmentName, MonthNumber, CallType 

EDIT : rawDataPtC는 수정없이 동일한 테이블 동안 PtC 될 수 없기 rawDataPtA는, 제거 NULL 값 데이터의 모든 행을 모두 갖는 테이블 NULL.

편집 : 왼쪽 PtaA보기에 PTAC에서 가입,

WITH rawDataPtA AS (
SELECT 
    DepartmentName, 
    MonthNumber, 
    CallType, 
    ROW_NUMBER() OVER(PARTITION BY DepartmentName, MonthNumber, CallType ORDER BY PtA ASC) AS RowNumberASC, 
    ROW_NUMBER() OVER(PARTITION BY DepartmentName, MonthNumber, CallType ORDER BY PtA DESC) AS RowNumberDESC, 
    PtA 
FROM 
    rawExract 
WHERE 
    PtA IS NOT NULL 
), rawDataPtC AS (
SELECT 
    DepartmentName, 
    MonthNumber, 
    CallType, 
    ROW_NUMBER() OVER(PARTITION BY DepartmentName, MonthNumber, CallType ORDER BY PtC ASC) AS RowNumberASC, 
    ROW_NUMBER() OVER(PARTITION BY DepartmentName, MonthNumber, CallType ORDER BY PtC DESC) AS RowNumberDESC, 
    PtC 
FROM 
    rawExract 
) 
+1

설명하는 사례와 관련된 몇 가지 샘플 데이터를 제공해 줄 수 있습니까? 또한 우리는 당신의 테이블 구조를 알지 못하고 많은 일을하지 않습니다. –

답변

1

하지 마십시오 조합하여 테이블 : 여기 는 rawDataPtArawDataPtC 있습니다

Select DepartmentName, MonthNumber, CallType, PtCMedian, PtAMedian 
From PtCView 
LEFT JOIN PtAView ON 
     PtCView.departmentName = PtAView.departmentName AND 
     PtCView.MonthNumber = PtAView.MonthNumber AND 
     PtCView.CallType = PtAView.CallType 
+0

굉장, 고마워 롭!^_ ^ – Matt

0

나는 혼동지고있어 당신의 언어. "PtA가 NULL 일 때 은 중앙값 계산에 포함되지 말아야합니다." 전체 행을 제외하거나 PtA 필드 만 제외해야합니까? 그런 다음 "PtA와 PtC가 모두 NULL이 아니라면 결합해야합니다." 가입하셨습니까? 어떻게 가입 했습니까?또한 "평균"이라고 말하지만 칼럼 별칭에 "중간 값"이라고 표시되며 계산 한 값은 평균을 월별로 취하는 것입니다.

여기에 두 가지 쿼리가 있습니다. 하나는 Pta가 NULL이 아닌 인스턴스 수에서 PtA의 평균을 나타냅니다. NULL은 무시되며 이는 AVG 함수의 정상적인 동작입니다. 다른 하나는 널 (NULL)을 0으로 취하면서 모든 행에 걸쳐 평균을 제공합니다. 어느 것이 당신이 원하는 것인가는 당신이 정말로 NULL을 어떻게 처리 할 것인가에 달려 있습니다.

SELECT DepartmentName, MonthNumber, CallType, (PtA) as PtA_Avg, Avg(PtC) as PtC_Avg 
FROM MyTable 
GROUP BY DepartmentName, MonthNumber, CallType; 

SELECT DepartmentName, MonthNumber, CallType, Avg(IsNull(PtA, 0)) as PtA_Avg, Avg(PtC) as PtC_Avg 
FROM MyTable 
GROUP BY DepartmentName, MonthNumber, CallType; 

여기서 두 결과를 나타내는 일부 샘플 데이터로 Fiddle이다.

관련 문제