質問

2009年02月03日 21時05分
  • sql分について

den
情シスのオープンナレッジ『Syszo』サービス終了のお知らせ

質問

初めまして
いつも拝見させていただいております。

現在mssqlserverに以下のようなテーブルがあります。

イベントID イベント日1 スタッフID1 イベント日2 スタッフID2
00001 2009/01/23 0001 2009/02/01 0002
00002 2009/01/31 0003 2009/02/01 0001
00003 2009/01/23 0003 2009/01/31 0002

これを以下のように表示したり

イベントID イベント日 スタッフID
00001 2009/01/23 0001
00003 2009/01/23 0003
00003 2009/01/31 0002
00002 2009/01/31 0003
00002 2009/02/01 0001
00001 2009/02/01 0002

以下のように表示したいのですが、可能でしょうか?

イベントID イベント日 スタッフID
00001 2009/01/23 0001
00002 2009/02/01 0001
00003 2009/01/31 0002
00001 2009/02/01 0002
00003 2009/01/23 0003
00002 2009/01/31 0003

お忙しいところ申し訳ありませんがよろしくお願いいたします。

3件の回答があります

回答

komtaqです。

実行環境がないので実動作確認はしていません。

参考までに。

SELECT
*
FROM
(SELECT             ・・・①-1
イベントID,
イベント日1 as "イベント日",
イベントID1 as "スタッフID"
FROM
tablename
WHERE
イベントID between ’00001’ AND
’00003’
UNION ALL            ・・・②
SELECT                ・・・①-2
イベントID,
イベント日2 as "イベント日",
イベントID2 as "スタッフID"
FROM
table
name
WHERE
イベントID between ’00001’ AND
’00003’
) AS U

ORDER BY "イベント日","スタッフID"  ・・・③

①1つのテーブルを2つのテーブル(①-1と①-2)として扱う。
 ※SELECT句で、列別名を指定して、同じ列名を使うようにしています。
<テーブル1(①-1)>
イベントID イベント日  スタッフID
00001 2009/01/23 0001
00002 2009/01/31 0003
00003 2009/01/23 0003

<テーブル2(①-2)>
イベントID イベント日  スタッフID
00001 2009/02/01 0002
00002 2009/02/01 0001
00003 2009/01/31 0002

②①で2つにしたテーブルを、UNION ALLでまとめます。
<まとめたテーブル>
イベントID イベント日  スタッフID
00001 2009/01/23 0001
00002 2009/01/31 0003
00003 2009/01/23 0003
00001 2009/02/01 0002
00002 2009/02/01 0001
00003 2009/01/31 0002

③ORDER BY句で、表示順を変える。
ここでは、列別名でテーブルを作ったので、列別名で指定する必要があります。

こんな感じで出来ると思います。
参考程度にしていただけたらと思います。

2009年02月04日 00時16分

回答

SELECT
イベントID, イベント日1 AS イベント日, スタッフID1 AS スタッフID
FROM テーブル
UNION SELECT
イベントID, イベント日2 AS イベント日, スタッフID2 AS スタッフID
FROM テーブル
ORDER BY イベント日

※ORDER BY句を「スタッフID」に変えれば、2つ目の結果がでます。

正規化された方がよろしいかと・・・

2009年02月04日 10時53分

回答

SQL1は WhiteFox さんと同じですが

−−−−−−−−−−−−−−−−−−
SELECT
T1."イベントID" as "イベントID",
T1."イベント日1" as "イベント日",
T1."スタッフID1" as "スタッフID"
FROM
TEST as T1

union

SELECT
T2."イベントID" as "イベントID",
T2."イベント日2" as "イベント日",
T2."スタッフID2" as "スタッフID"
FROM
TEST as T2

order by "イベント日","スタッフID"
−−−−−−−−−−−−−−−−−−
SQL2は
−−−−−−−−−−−−−−−−−−
SELECT
T1."イベントID" as "イベントID",
T1."イベント日1" as "イベント日",
T1."スタッフID1" as "スタッフID"
FROM
TEST as T1

union

SELECT
T2."イベントID" as "イベントID",
T2."イベント日2" as "イベント日",
T2."スタッフID2" as "スタッフID"
FROM
TEST as T2

order by "スタッフID","イベント日"
−−−−−−−−−−−−−−−−−−

イベントID イベント日 スタッフID
00001 2009/01/23 0001
00003 2009/01/23 0003
00003 2009/01/31 0002
00002 2009/01/31 0003
00002 2009/02/01 0001
00001 2009/02/01 0002

イベントID イベント日 スタッフID
00001 2009/01/23 0001
00002 2009/02/01 0001
00003 2009/01/31 0002
00001 2009/02/01 0002
00003 2009/01/23 0003
00002 2009/01/31 0003
がでます。

テーブルは
CREATE TABLE "TEST" (
"イベントID" varchar(5) NOT NULL default ’’,
"イベント日1" date default NULL,
"スタッフID1" varchar(4) default NULL,
"イベント日2" date default NULL,
"スタッフID2" varchar(4) default NULL,
PRIMARY KEY ("イベントID")
)
で できるのではないでしょうか

2009年02月04日 16時18分

あなたもコメントしましょう!