- PR -

1つの行から複数selectしたいのですが

1
投稿者投稿内容
のっぴき
会議室デビュー日: 2006/02/06
投稿数: 5
投稿日時: 2006-02-06 15:20
OS:Windows2000
DB:SQL Server7

table1
ID(smalllint) 価格(smallint) 開始日(tinyint) 終了日(tinyint)
1 100 0 1
2 150 2 5
3 200 3 3

結果
ID 価格 日
1 100 0
1 100 1
2 150 2
2 150 3
2 150 4
2 150 5
3 200 3

table1から結果を得れるようなクエリを作成したいのですが、
適切な構文が思いつきません。

どのようなクエリにしたら結果が得れるか、アドバイス等お願いいたします。

あいまいな件名&タコすぎる質問で申し訳ありません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-06 16:52
範囲を見てその間のレコードを補足しなきゃいけないんですよね?
T-SQL でやっちゃダメなんですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-02-06 17:51
コード:
DECLARE @I int, @Min int, @Max int;
SET @Min = (SELECT Min([開始日]) FROM table1);
SET @Max = (SELECT Max([終了日]) FROM table1);

CREATE TABLE #temp ([日] int);

SET @I = @Min;
WHILE @I <= @Max BEGIN
	INSERT INTO #temp([日]) VALUES(@I);
	SET @I = @I + 1;
END

SELECT
	table1.[ID] AS [ID],
	table1.[価格] AS [価格],
	#temp.[日] AS [日]
FROM table1, #temp
WHERE table1.[開始日] <= #temp.[日] AND #temp.[日] <= table1.[終了日]
ORDER BY table1.[ID], #temp.[日]




こんなんしか思いつかない…。2000以降しか知らないので、使えない機能使っているかも。別のやり方あるかなぁ。

# おまけ
# MSSQL2005 CTEの練習(SQL Server2005以降)

コード:

WITH [R]([ID], [価格], [日], [終了日]) AS (
	SELECT
		[ID] AS [ID],
		[価格] AS [価格],
		[開始日] AS [日],
		[終了日] AS [終了日]
	FROM table1
	UNION ALL
	SELECT
		[R].[ID] AS [ID],
		[R].[価格] AS [価格],
		[R].[日] + 1 AS [日],
		[R].[終了日] AS [終了日]
	FROM [R]
	WHERE [R].[日] + 1 <= [R].[終了日]
) SELECT [ID], [価格], [日] FROM [R] ORDER BY [ID], [日];


とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2006-02-08 18:38
SQL Serverはあまり良く知らないのですが、
開始日と終了日の差が27以内なら、こんなのも可能ではないかと...

コード:
SELECT ID
     , 価格
     , 開始日 + n  AS 日
  FROM (SELECT n1+n2*3+n3*9
          FROM (SELECT 0
                UNION ALL
                SELECT 1
                UNION ALL
                SELECT 2) P1(n1)
             , (SELECT 0
                UNION ALL
                SELECT 1
                UNION ALL
                SELECT 2) P2(n2)
             , (SELECT 0
                UNION ALL
                SELECT 1
                UNION ALL
                SELECT 2) P3(n3)
       ) P(n)
       INNER JOIN
       table1
         ON  開始日 + n <= 終了日
 ORDER BY
       ID, 日;


1

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