2014-11-04 62 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子句。

我嘗試以下

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 

但這輸出我得到

Id DepOld DepNew 
-------------------- 
000 54  54 
000 12  NULL 
141 14  14 
141 56  Null 

如果我通過DEPID = 54那麼這個輸出是什麼,我想

ID DepOld DepNew


000 54  12 
+0

全自聯接與狀態字段的附加條件應該工作。 – Arvo 2014-11-04 13:59:38

+0

有自動加入 – 2014-11-04 13:59:43

+0

檢查您的數據。第1,2和5,6行的ID是否應該等於000?與建議的結果相同。 – anonxen 2014-11-04 14:05:30

回答

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 - 輸出有什麼問題?更新問題 – 2014-11-04 14:05:30

+0

我現在嘗試了你的建議,但它給了我不一致的信息 – john 2014-11-04 14:11:43

+0

@john什麼是ID列的數據類型 – 2014-11-04 14:21:13

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兩排,其中一個狀態= 0和其他與狀態= 1,你可以參加表本身基於該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的色標,其中沒有old.DepID AS DepOld,new.DepID AS DepNew可供選擇 – john 2014-11-04 14:09:20