質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.11%

インラインビューを使用したデータの表示方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 73

nyanchu0090

score 2

下表のようなデータがあるとして、「A」列と「D」列で以下のように絞り込みを行います。
「A」列:1000
「D」列:1A

その場合、通常なら4行目までのデータが表示されると思いますが
絞り込みにより取得された「A」「B」列の値を条件にして、
該当しているものを下表の「※」列記載のように表示させたいと考えています。
本来あれば5、6行目は取得されませんが、
「A」列で取得した「1000」という値が該当しているため表示させたい
ということです。

「※」列は補足として用意したもので、本来はありません。


表1
Table:XYZ 

 #   A   B   C   D              ※1  
 1  1000 201 002 1A 絞り込みで表示される
 2  1000 202 001 1A 絞り込みで表示される
 3  1000 202 002 1A 絞り込みで表示される
 4  1000 203 001 1A 絞り込みで表示される
 5  1000 204 001 2A 絞り込みで表示されないが、表示されるようにしたい
 6  1000 204 002 2A 絞り込みで表示されないが、表示されるようにしたい
 7  1001 205 001 2A 絞り込みで表示されない

インラインビューを使用することで実現できそうだ
というところまでわかっていますが、
そこから先の構築がわからず詰まっています。
どなたかお力添えいただければ幸いです。

何卒宜しくお願い致します。

SQL ,SQL Server ,SQL ,Server Reporting Server

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

レコード 1, 2, 3, 4 と 5, 6 を区別したいのであれば、
質問欄の※列に該当する意味を持つ列を作ってしまうのがよいでしょう:

SELECT XYZ.#, XYZ.A, XYZ.B, XYZ.C, XYZ.D, INLINE.# AS1
FROM XYZ
LEFT JOIN (
  SELECT #
  FROM XYZ
  WHERE A = 1000 AND D = "1A"
) AS INLINE
ON XYZ.# = INLINE.#
WHERE A = 1000 OR D = "1A";
# A B C D ※1
1 1000 201 002 1A 1
2 1000 202 001 1A 2
3 1000 202 002 1A 3
4 1000 203 001 1A 4
5 1000 204 001 2A NULL
6 1000 204 002 2A NULL

そして、アプリケーションで ※1 列の値に従って
表示する・しない を切り替えます

考え方

例えば、次のような SQL でレコード 1, 2, 3, 4, 5, 6 が取得できます:

SELECT A, B, C, D FROM XYZ WHERE A = 1000 OR D = "1A";

また、次のような SQL でレコード 1, 2, 3, 4 のみを取得できます:

SELECT A, B, C, D FROM XYZ WHERE A = 1000 OR D = "1A";

この 2 つのクエリーをインラインビューで組み合わせます

このとき、たくさんの行を取得する方から、少しの行を取得する方に向かって
LEFT JOIN することに気をつけます

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「A」列:1000
「D」列:1A 
この条件で絞り込みをしているとは言えないと個人的には思います。
『「B」列の値を条件にして』の部分は何のことなのかわからないので
書いてある通りの結果を出すならwhereで「D='1A'」を書かないほうがいいと思いますね。
私の中ではwhereは「A=1000」だけですね。Dで絞り込んでいるとは思えない。
D列は値の表示に使っているという認識です。

with XYZ (#,A,B,C,D) as (
    select 1,1000,201,'002','1A'
    union all select 2,1000,202,'001','1A'
    union all select 3,1000,202,'002','1A'
    union all select 4,1000,203,'001','1A'
    union all select 5,1000,204,'001','2A'
    union all select 6,1000,204,'002','2A'
    union all select 7,1001,205,'001','2A'
)
select *
    ,case when D='1A' then '絞り込みで表示される1A' else '絞り込みで表示されないが、表示されるようにしたい1A以外' end as コメント
from XYZ 
where A=1000

/*
#           A           B           C    D    コメント
----------- ----------- ----------- ---- ---- ------------------------------------------------------
1           1000        201         002  1A   絞り込みで表示される1A
2           1000        202         001  1A   絞り込みで表示される1A
3           1000        202         002  1A   絞り込みで表示される1A
4           1000        203         001  1A   絞り込みで表示される1A
5           1000        204         001  2A   絞り込みで表示されないが、表示されるようにしたい1A以外
6           1000        204         002  2A   絞り込みで表示されないが、表示されるようにしたい1A以外

(6 rows affected)
*/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる