2014-11-04 2 views
-1
ID DepID Status 
------------------ 
000 54 0 
000 12 1 
141 14 0 
141 56 1 
000 12 0 
000 89 1 

나는 depID이있는 위의 표를 가지고 있습니다. 필요한 출력은 다음과 같습니다.하나의 열을 두 개로 나누어서 SQL 열에서 데이터를 검색하십시오.

ID DepOld DepNew 
------------------- 
000 54  12 
141 14  56 
000 12  89 

상태가 0이면 이전이고 1은 새로운 것을 의미합니다. 위의 출력을 한 테이블에있는 것으로 간주하여 어떻게 얻습니까?

IN 절을 사용할 수 없습니다.

나는 내가 depID = 54 다음이 출력 내가

ID DepOld DepNew

를 원하는 것입니다 통과하면 내가
Id DepOld DepNew 
-------------------- 
000 54  54 
000 12  NULL 
141 14  14 
141 56  Null 

를 얻을 다음

SELECT 
    ID, 
    Max(CASE 
      WHEN Status = 0 THEN DepID 
     END) DepOld, 
    Max(CASE 
      WHEN Status = 1 THEN DepID 
     END) DepNew 
FROM 
    tablename 
GROUP BY 
    ID 

하지만,이 출력을 시도


000 54  12 
+0

전체 자체 조인 작동합니다 상태 필드에 대한 추가 조건. – Arvo

+0

자체 참여로 –

+0

데이터를 확인하십시오. 1, 2, 5, 6 행의 ID가 동일해야합니까? 제안 된 결과와 동일합니다. – anonxen

답변

0

Case statementMax aggragate을 사용하면 결과를 얻을 수 있습니다.

CREATE TABLE #fast 
    (
    ID  VARCHAR(100), 
    DepID INT, 
    Status INT 
) 

INSERT INTO #fast 
VALUES  ('000',54,0), 
      ('000',12,1), 
      ('141',14,0), 
      ('141',56,1), 
      ('000',12,0), 
      ('000',89,1) 


SELECT ID, 
     Max(CASE 
      WHEN Status = 0 THEN DepID 
      END) DepOld, 
     Max(CASE 
      WHEN Status = 1 THEN DepID 
      END) DepNew 
FROM tablename 
GROUP BY ID 
+0

@john - 출력에 어떤 문제가 있습니까 ?? –

+0

나는 당신의 제안을 지금 시도했으나 일치하지 않는 정보를 주었다. – john

+0

@john ID 열의 데이터 유형은 무엇입니까 –

1

조건부 집계 사용할 수 있습니다 : 당신이 오직 ID 당 두 개의 행, 상태 = 0 일 및 상태 = 1과 다른해야하는 경우 테이블을 조인 수

select id, 
     max(case when status = 0 then DepID end) as DepOld, 
     max(case when status = 1 then DepID end) as DepNew 
from table t 
group by id; 
0

을 단일 행의 이전 및 새 부서 ID를 모두 사용할 수 그래서 자체에 ID 열을 기준 :

SELECT old.ID, old.DepID AS DepOld, new.DepID AS DepNew 
FROM your_table old 
INNER JOIN your_table new ON old.ID = new.ID AND new.Status = 1 
WHERE old.Status = 0 
+0

select 문에 Depid라는 이름의 coloumn이 하나만 있습니다. theres no old.DepID AS DepOld, new.DepID AS DepNew – john

관련 문제