0

構造が不均衡なスプレッドシートがあります

    ID Date       Val Date       Val Date       Val
    1  2000/01/01 2   2000/12/31 1  
    2  1999/01/28 6   2001/02/01 5   2001/12/31 6
    ....

次のようなものに並べ替えたい

    ID Date       Val
    1  2000/01/01 2
    1  2000/12/31 1
    2  1999/01/28 6
    2  2001/02/01 5
    2  2001/12/31 6
    ....

MS SQL Server でこれを行う方法を教えてください。ありがとうございました!

サンプルデータ:

    create table tmp
    (
        id smallint not null,
        date1 Date,
        val1 smallint,
        date2 date,
        val2 smallint,
        date3 date,
        val3 smallint
     );

     insert into tmp(id, date1, val1, date2, val2) values (1, '2001-01-01',5,'2001-12-31',6);
     insert into tmp(id, date1, val1, date2, val2, date3, val3) values (2, '1999-02-01',3,'2000-12-31',2, '2001-05-01',3);

     select * from tmp

    1   2001-01-01  5   2001-12-31  6   NULL    NULL
    2   1999-02-01  3   2000-12-31  2   2001-05-01  3

ただし、次のコードは戻ります

     select c.* from tmp cross apply 
    (
        select id, date1, val1 from tmp where date1 is not null
        union all
        select id, date2, val2 from tmp where date2 is not null
        union all
        select id, date3, val3 from tmp where date3 is not null
    ) 
     as c

    1   2001-01-01  5
    1   2001-01-01  5
    2   1999-02-01  3
    2   1999-02-01  3
    1   2001-12-31  6
    1   2001-12-31  6
    2   2000-12-31  2
    2   2000-12-31  2
    2   2001-05-01  3
    2   2001-05-01  3
4

1 に答える 1

1

SQL Server 2005 以降では、ソース データ セットの各行に関数/サブクエリを適用できます。

SELECT
  normalised.*
FROM
  yourTable AS tmp
CROSS APPLY
(
  SELECT tmp.id, tmp.date1, tmp.val1 WHERE tmp.date1 IS NOT NULL
  UNION ALL
  SELECT tmp.id, tmp.date2, tmp.val2 WHERE tmp.date2 IS NOT NULL
  UNION ALL
  SELECT tmp.id, tmp.date3, tmp.val3 WHERE tmp.date3 IS NOT NULL
)
  AS normalised


Sql Server 2005 より前では、結合された 3 つの個別のクエリとしてこれを行うことができました。

  SELECT id, date1, val1 FROM yourTable WHERE date1 IS NOT NULL
  UNION ALL
  SELECT id, date2, val2 FROM yourTable WHERE date2 IS NOT NULL
  UNION ALL
  SELECT id, date3, val3 FROM yourTable WHERE date3 IS NOT NULL
于 2012-11-14T12:16:29.840 に答える