如何将src列的不同值移动到不同的列

时间:2017-08-20 04:44:12

标签: sql sql-server

我有以下数据

sk_patient  casenumber  src     status  pen_dt
-1           2345       POPDB   CLOSED  2012-01-01
-1           235        POPDB   CLOSED  2012-01-01
-1           245        JCARE   CLOSED  2012-01-02
1244         2          POPDB   CLOSED  2012-01-01
273          2345       POPDB   CLOSED  2012-03-04
1244         23         JCARE   CLOSED  2012-05-02

需要根据不同的src列值将其转换为以下内容。

sk_patient  casenumber1  src1    status1    pen_dt1     casenumber2 src2  status2   pen_dt2
    -1       2345        POPDB   CLOSED     2012-01-01   245        JCARE  CLOSED   2012-01-02
    -1       235         POPDB   CLOSED     2012-01-01   NULL       NULL   NULL     NULL
    1244     2           POPDB   CLOSED     2012-01-01   23        JCARE   CLOSED    2012-05-02
    273      2345        POPDB   CLOSED     2012-03-04   NULL       NULL   NULL     NULL

例如,

对于-1,我们有3行,但其中有两行具有相同的src,所以我们将它们原样,但3行具有不同的值。因此,需要将其移动到src2列以及相关的列值。

对于任何特定src,最小1和最多3个不同sk_patient可以关联。

===更新===

直到现在,我能够做到以下

seq sk_patient  casenumber  src     status  pen_dt
2   -1           2345       POPDB   CLOSED  2012-01-01
2   -1           235        POPDB   CLOSED  2012-01-01
1   -1           245        JCARE   CLOSED  2012-01-02
2   1244         2          POPDB   CLOSED  2012-01-01
1   273          2345       POPDB   CLOSED  2012-03-04
1   1244         23         JCARE   CLOSED  2012-05-02

我使用了以下查询

select dense_rank() 
       over(partition by sk_patient order by sk_patient, src) as seq, 
       * from patient

如上例所示,有人可以帮助我移动价值吗?

1 个答案:

答案 0 :(得分:0)

SELECT tp1.sk_patient,
       tp1.casenumber casenumber1,
       tp1.src src1,
       tp1.status status1,
       tp1.pen_dt pen_dt1,
       tp2.casenumber2,
       tp2.src2,
       tp2.status2,
       tp2.pen_dt2
  FROM t_patient tp1
  LEFT OUTER JOIN (SELECT sk_patient,
                          MAX(CASE WHEN rnum = 1 THEN casenumber END) casenumber1,
                          MAX(CASE WHEN rnum = 1 THEN src END) src1,
                          MAX(CASE WHEN rnum = 1 THEN status END) status1,
                          MAX(CASE WHEN rnum = 1 THEN pen_dt END) pen_dt1,
                          MAX(CASE WHEN rnum = 2 THEN casenumber END) casenumber2,
                          MAX(CASE WHEN rnum = 2 THEN src END) src2,
                          MAX(CASE WHEN rnum = 2 THEN status END) status2,
                          MAX(CASE WHEN rnum = 2 THEN pen_dt END) pen_dt2
                     FROM (SELECT *,
                                  DENSE_RANK() OVER (PARTITION BY sk_patient ORDER BY src DESC) rnum
                             FROM t_patient
                          ) t
                    GROUP BY sk_patient
                  ) tp2
    ON tp1.sk_patient = tp2.sk_patient
   AND tp1.casenumber = tp2.casenumber1
   AND tp1.src = tp2.src1
 WHERE tp1.src != 'JCARE'

结果

sk_patient  casenumber1 src1    status1 pen_dt1     casenumber2 src2    status2 pen_dt2
-1          2345        POPDB   CLOSED  2012-01-01  245         JCARE   CLOSED  2012-01-02
-1          235         POPDB   CLOSED  2012-01-01  NULL        NULL    NULL    NULL
1244        2           POPDB   CLOSED  2012-01-01  23          JCARE   CLOSED  2012-05-02
273         2345        POPDB   CLOSED  2012-03-04  NULL        NULL    NULL    NULL