C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLServer でのデータの取り出し方法を教えてください

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■94641 / inTopicNo.1)  SQLServer でのデータの取り出し方法を教えてください
  
□投稿者/ 紅子 (7回)-(2020/04/27(Mon) 10:05:55)

分類:[.NET 全般] 

NO DATA FLG
10 ''  1
20 '10' 2
20 ''  2
30 ''  2
40 ''  1
50 ''  2
50 '5,7' 2

NO順に並べた時にFLGの変化で区切りDATA に @DATA が含んでいれば
その前の区切りのデータを取り出す方法を教えてください

NO DATA FLG
10 ''  1
----------
20 '10' 2
20 ''  2
30 ''  2
----------
40 ''  1
----------
50 ''  2
50 '5,7' 2

例1>>
DECLARE @NO INT = 50;
DECLARE @DATA VARCHAR('5');
→[40 ''  1]を取出す
例2>>
DECLARE @NO INT = 40;
DECLARE @DATA VARCHAR('');
この場合
→[20 '10' 2]
→[20 ''  2]
→[30 ''  2]
3つを取出す

よろしくお願いいたします

引用返信 編集キー/
■94652 / inTopicNo.2)  Re[1]: SQLServer でのデータの取り出し方法を教えてください
□投稿者/ kiku (174回)-(2020/04/28(Tue) 17:32:59)
2020/04/28(Tue) 17:48:27 編集(投稿者)
No94641 (紅子 さん) に返信

効率的なSQL文ではないと思いますが
方向性だけ示してみました。
下記のような中間テーブルを作れば要望事項を達成できそうです。

  select
  *
  ,
  (
    select max(t5.NO)
	from
	(
		select *
		from [TEST].[dbo].[test] as t4
		order by t4.NO, t4.FLG OFFSET 0 ROWS
	) as t5
	where t5.FLG = t6.FLG and t5.NO < t6.NoEnd
  ) as NoStart
  from
  (
	  SELECT 
	  *
	  ,
	  (
		select max(t3.NO)
		from
		(
			select *
			from [TEST].[dbo].[test] as t2
			order by t2.NO, t2.FLG OFFSET 0 ROWS
		) as t3
		where t3.FLG <> t1.FLG and t3.NO < t1.NO
	  ) as NoEnd
	  FROM [TEST].[dbo].[test] as t1
	  order by t1.NO, t1.FLG OFFSET 0 ROWS
  ) as t6

NO	DATA	FLG	NoEnd	NoStart
10		1	NULL	NULL
20	10	2	10	NULL
20		2	10	NULL
30		2	10	NULL
40		1	30	10
50		2	40	30
50	5,7	2	40	30

利用の仕方ですが、
40がヒットした場合、
NoStart=10より大きくかつNoEnd=30以下かつFLG=1でないレコードを抽出すればOKのはず。

NoEndの算出方法は、40を例にした場合、
NO=40より小さく、FLG=1でなく、最大のNO=30を取得。

NoStartの算出方法は、40を例にした場合、
NoEnd=30より小さく、FLG=1であり、最大のNO=10を取得。

引用返信 編集キー/
■94654 / inTopicNo.3)  Re[1]: SQLServer でのデータの取り出し方法を教えてください
□投稿者/ 魔界の仮面弁士 (2706回)-(2020/04/28(Tue) 22:25:31)
※この投稿は回答ではありません。(前提条件で気になる点があったので確認のみ)

No94641 (紅子 さん) に返信
> DECLARE @DATA VARCHAR('5');

上記のステートメントが SQL Server の文法に合致しないのですが、
もしかして、こういう事でしょうか。

DECLARE @DATA VARCHAR(MAX) = '5';


> NO順に並べた時にFLGの変化で

「NO順に並べた時」とのことですが、重複する NO が存在する以上、
その条件だけでは、並び順を確定させることができないはずです。

実際、NO = 20 と NO = 50 のレコードを比べると、
20 の方は ORDER BY NO, DATA DESC 相当で、
50 の方は ORDER BY NO, DATA ASC 相当のように見えます。


質問時の前提条件に漏れているだけで、実際にはソート用の情報が他にもあるのでしょうか?
並び順が明示されていない場合、取得されるデータの順番は保証されませんので、ご注意ください。

特に「同じ NO 内で、異なる FLG 値を持ったデータ」がありえる場合には、
データの区切りが変わってきてしまう恐れがあります。


> NO順に並べた時にFLGの変化で区切りDATA に @DATA が含んでいれば

上記については、@DATA が '1' や '0' だった場合、LIKE 検索を使うと、
> 20 '10' 2
のレコードも区切りと見做されることになりそうです。
これを許容するかどうかも、考慮する必要がありそうですね。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ