通过将一列拆分为两列来从sql列中检索数据

时间:2014-11-04 13:55:28

标签: sql sql-server sql-server-2008

ID  DepID   Status
------------------
000 54  0
000 12  1
141 14  0
141 56  1
000 12  0
000 89  1

我上面的表格中有depID。以下是我需要的输出:

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

3 个答案:

答案 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;

答案 1 :(得分: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 

答案 2 :(得分:0)

如果每个ID只有两行,一个状态为0,另一个状态为= 1,则可以根据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