2014-11-04 39 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