- PR -

SQLで1行から複数行を返却するSELECT文

1
投稿者投稿内容
miz
会議室デビュー日: 2006/11/20
投稿数: 2
投稿日時: 2006-11-20 23:23
どなたかご意見くださいませ。

SQLServer2000で。

コード   回数
---------------
A001   1
A002   2
A003   3
B001   1
---------------

この↑ような表から
「コード」に対応する「回数」の分だけ
「コード」と「SEQ(1〜「回数」の値まで)」を返却する
次↓のような表を返却するSQL文をかけますでしょうか。

コード   SEQ
---------------
A001   1
A002   1
A002   2
A003   1
A003   2
A003   3
B001   1
---------------

何かよいアイディアをお持ちの方、
お力添えくださいませ。

よろしくお願い致します。
つんけん
会議室デビュー日: 2003/12/18
投稿数: 5
お住まい・勤務地: 京都
投稿日時: 2006-11-21 12:53
SQLServerは使ったことがないのですが、
1から始まる連番をもったテーブルを作ればできないですかね。

SEQ
-------
1
2
3




SEQ <= 回数 で結合すればご希望のデータが作れると思います。
検証していないのでダメダメだったらすみません。
データを読む側(プログラム)でやった方がいい気もしますが…
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-11-21 13:01
「コード」と「SEQ(1〜「回数」の値まで)」を返すSQL文が何故必要になるのか・・が知りたい気もしますが(汗

引用:

つんけんさんの書き込み (2006-11-21 12:53) より:
データを読む側(プログラム)でやった方がいい気もしますが…



私もプログラム側の仕事にした方がいいと思います。SQLで出来たとしても後々悩みそうで・・。
oracle
常連さん
会議室デビュー日: 2003/12/04
投稿数: 29
お住まい・勤務地: さいたま
投稿日時: 2006-11-21 13:01
http://www7.big.or.jp/~pinball/discus/sqls/30321.html

クロスしてます
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-11-21 13:06
引用:

shimixさんの書き込み (2006-11-21 13:01) より:
「コード」と「SEQ(1〜「回数」の値まで)」を返すSQL文が何故必要になるのか・・が知りたい気もしますが(汗



集計元の表を持っていないんじゃないですか?
(意図的かは別にして)非正規化して捨てちゃったとか。
miz
会議室デビュー日: 2006/11/20
投稿数: 2
投稿日時: 2006-11-22 17:06
皆様ご意見ありがとうございました。

> つんけん 様
 アイディアをありがとうございます。
 1から始まる連番をもったテーブルと結合は
 案の1つでしたがMAXをどこまでもつかで悩みやめてしまいました。
> shimix 様
 投稿した内容で得られた結果を1つのテーブルとして
 またさらに別のテーブルと結合した結果を得る必要があります。
 その処理がプログラムで処理するにはちょっと重たい処理になるので
 (コードもレスポンスも)
 SQLでやりたいと思いました。
> oracle 様
 こういった会議室に投稿するのが初めてでした。
 多くの皆さんのご意見をうかがいたく
 2つの会議室に同一の内容で投稿しました。
 マナー違反でしたらお詫びいたします。

【解決策】
欲しい結果の形をユーザー定義関数の返却値とするようにし
それをselectするようにしました。

------------------------
CREATE FUNCTION TEST_FUNC

RETURNS @結果 TABLE
(
  コード char(10)
  ,SEQ  numeric(3,0)
 )

AS
 BEGIN
  DECLARE @Counter INTEGER

  DECLARE @コード    char(10)
  DECLARE @回数     numeric(3,0)

  DECLARE CUR CURSOR FOR
    SELECT コード, 回数 FROM TABLE1

  OPEN CUR

  FETCH NEXT FROM CUR INTO @コード, @回数

  WHILE @@FETCH_STATUS = 0
  BEGIN
    SET @Counter = 1
    WHILE @Counter <=  @回数
    BEGIN
     INSERT INTO @結果
     ( コード, SEQ )
     VALUES
     ( @コード, @Counter )
     SET @Counter = @Counter + 1
    END
    FETCH NEXT FROM CUR INTO @コード, @回数
  END

  RETURN

 END

------------------------

SELECT * FROM TEST_FUNC()

1

スキルアップ/キャリアアップ(JOB@IT)