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

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

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

SQLServer で共通するデータの取得方法

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

■89787 / inTopicNo.1)  SQLServer で共通するデータの取得方法
  
□投稿者/ ルパン (7回)-(2018/12/26(Wed) 10:43:03)

分類:[.NET 全般] 

2018/12/26(Wed) 10:43:42 編集(投稿者)

SQLServer2016 を使用しています。
以下のようなデータがテーブルに登録されています。

Name No ID
A 7 a
A 12 b
A 14 a
A 14 b
B 7 a
B 7 b
B 8 b
B 10 b
B 12 a
B 12 b
B 14 a
B 14 b
B 16 b
C 5 a
C 7 a
C 7 b
C 8 b
C 10 b
C 12 a
C 12 b
C 14 a
C 14 b
C 16 b
C 18 b

条件にNoを指定したときに
全てのNameに登録されているNoのID
を取得したいのですがどうすればよいのでしょうか?

例>No = 7 を指定する

A 7 a
B 7 a
B 7 b
C 7 a
C 7 b

全ての Name に共通して存在するのは[a]のみなので
[a]が取得される

No = 14 を指定すると

A 14 a
A 14 b
B 14 a
B 14 b
C 14 a
C 14 b

全ての Name に共通して存在するのは[a]と[b]なので
[a]と[b]が取得される

No = 16 を指定すると

B 16 b
C 16 b

Name[A]には No[16]が存在しないので何も取得されない。

引用返信 編集キー/
■89788 / inTopicNo.2)  Re[1]: SQLServer で共通するデータの取得方法
□投稿者/ YuO (1回)-(2018/12/26(Wed) 12:05:56)
No89787 (ルパン さん) に返信
> 条件にNoを指定したときに
> 全てのNameに登録されているNoのID
> を取得したいのですがどうすればよいのでしょうか?

[ID]でGroup ByしてCOUNT([Name])が3のものだけを取り出す,とすればよいのではないでしょうか。

とりあえずお試し。
DECLARE @test TABLE ( [Name] CHAR, [No] INT, [ID] CHAR )

INSERT INTO @test
VALUES
    ( 'A', 7, 'a' ),
    ( 'A', 12, 'b' ),
    ( 'A', 14, 'a' ),
    ( 'A', 14, 'b' ),
    ( 'B', 7, 'a' ),
    ( 'B', 7, 'b' ),
    ( 'B', 8, 'b' ),
    ( 'B', 10, 'b' ),
    ( 'B', 12, 'a' ),
    ( 'B', 12, 'b' ),
    ( 'B', 14, 'a' ),
    ( 'B', 14, 'b' ),
    ( 'B', 16, 'b' ),
    ( 'C', 5, 'a' ),
    ( 'C', 7, 'a' ),
    ( 'C', 7, 'b' ),
    ( 'C', 8, 'b' ),
    ( 'C', 10, 'b' ),
    ( 'C', 12, 'a' ),
    ( 'C', 12, 'b' ),
    ( 'C', 14, 'a' ),
    ( 'C', 14, 'b' ),
    ( 'C', 16, 'b' ),
    ( 'C', 18, 'b' )
;

SELECT
    [No],
    [ID]
FROM
    @test
WHERE
    [No] IN ( 7, 14, 16)
GROUP BY
    [No], [ID]
HAVING
    COUNT(DISTINCT [Name]) = (SELECT COUNT(DISTINCT [Name]) FROM @test)
;

-- 結果
No ID
7  a
14 a
14 b

引用返信 編集キー/
■89789 / inTopicNo.3)  Re[1]: SQLServer で共通するデータの取得方法
□投稿者/ shu (1159回)-(2018/12/26(Wed) 12:19:01)
2018/12/26(Wed) 12:19:49 編集(投稿者)
No89787 (ルパン さん) に返信

提示されたテーブルを_tblとします。
No = 14のところを与えられたものに変えれば多分大丈夫。
全ての NameというのがA,B,Cとは限らないということであれば
もっと工夫が必要になりそうです。

Select ID
From (
  SELECT [A],[B],[C], ID
  From 
    (Select Name,  No, ID
	  From _tbl
	  Where No = 14) as tbl1
	PIVOT
	(
	   COUNT(Name) For Name In (A, B, C)
	) As Ptbl
) tbl2
Where A=1 and B=1 and C=1

引用返信 編集キー/
■89791 / inTopicNo.4)  Re[2]: SQLServer で共通するデータの取得方法
□投稿者/ ルパン (8回)-(2018/12/26(Wed) 16:12:39)
ありがとうございました。

Grepを使うと思った結果をえることができました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ