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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

490閲覧

SQLの別テーブルの情報を取得し、取得結果によって出力内容を変更する

h-kn

総合スコア30

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2022/09/08 03:09

前提

SQL初心者です
現在SQLで備考の非表示フラグが1の場合はタイトル、内容を読み込まず空白データを出力させる機能を作成中です

実現したいこと

・マジックナンバーを利用してはいけないとのご指摘を頂いたのですが、どのように修正するかわからない
・SQLをもう少し分かりやすくしたい

SQLデータ

DATA

DATA_NODATA_BIKO1DATA_BIKO2DATA_BIKO3DATA_BIKO4DATA_BIKO5
1ここは備考ですここは履歴ですここは注意事項ですここはその他ですここは日時です
2hogehogehugahugahoge
:::::

CODMST

COD_KBNCOD_CODECOD_NAMECOD_DELFLG
BIKOTL1備考0
BIKOTL2履歴0
BIKOTL3注意事項0
BIKOTL4その他1
BIKOTL5日時1

該当のソースコード

SELECT
DATA_BIKO1 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 1)= 1,'',DATA_BIKO1),
DATA_BIKO2 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 2)= 1,'',DATA_BIKO2),
DATA_BIKO3 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 3)= 1,'',DATA_BIKO3),
DATA_BIKO4 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 4)= 1,'',DATA_BIKO4),
DATA_BIKO5 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 5)= 1,'',DATA_BIKO5),
BIKO1 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 1)= 1,'',(SELECT COD_NAME FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 1)),
BIKO2 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 2)= 1,'',(SELECT COD_NAME FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 2)),
BIKO3 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 3)= 1,'',(SELECT COD_NAME FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 3)),
BIKO4 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 4)= 1,'',(SELECT COD_NAME FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 4)),
BIKO5 = IIF((SELECT COD_DELFLG FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 5)= 1,'',(SELECT COD_NAME FROM CODMST WHERE COD_KBN = 'BIKOTL' AND CONVERT(smallint, COD_CODE) = 5))
FROM DATA

実行結果

太字 = 上枠から順にBIKO1,BIKO2...
太字下部 = 上枠から順にDATA_BIKO1.DATA_BIKO2
※DATA_NO = 1の出力結果です
イメージ説明

補足情報(FW/ツールのバージョンなど)

vb.net内でGrapeCity.ActiveReportsに出力するためのSQLです

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

・マジックナンバーを利用してはいけないとのご指摘を頂いたのですが、どのように修正するかわからない

COD_CODEの数値しか該当するものは無さそうなので、それが該当するとします。
この場合、定数などの名称付けられたもので置き換えるという事になりますけど、マスターテーブルの値を定数化するとか意味不明です。
やるならマスターテーブルは使用せずに、コード値を定数として定義してそれを使用する、
若しくは、コード値を数値ではなく文字にする(COD_CODEをCOD_KBNのような値にする)という事になるかと思います。

・SQLをもう少し分かりやすくしたい

SQL

1select case when BIKO1 is not Null then DATA_BIKO1 end as DATA_BIKO1 2 , case when BIKO2 is not Null then DATA_BIKO2 end as DATA_BIKO2 3 , case when BIKO3 is not Null then DATA_BIKO3 end as DATA_BIKO3 4 , case when BIKO4 is not Null then DATA_BIKO4 end as DATA_BIKO4 5 , case when BIKO5 is not Null then DATA_BIKO5 end as DATA_BIKO5 6 , BIKO.* 7from DATA cross join ( 8 select max(case when CONVERT(smallint, COD_CODE)=1 and COD_DELFLG=0 then CODE_NAME end) as BIKO1 9 , max(case when CONVERT(smallint, COD_CODE)=2 and COD_DELFLG=0 then CODE_NAME end) as BIKO2 10 , max(case when CONVERT(smallint, COD_CODE)=3 and COD_DELFLG=0 then CODE_NAME end) as BIKO3 11 , max(case when CONVERT(smallint, COD_CODE)=4 and COD_DELFLG=0 then CODE_NAME end) as BIKO4 12 , max(case when CONVERT(smallint, COD_CODE)=5 and COD_DELFLG=0 then CODE_NAME end) as BIKO5 13 from CODMST 14 where COD_KBN = 'BIKOTL' 15 group by COD_KBN 16 ) BIKO 17

投稿2022/09/08 04:49

編集2022/09/08 05:01
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h-kn

2022/09/09 01:51

このような書き方を思いつきませんでした! こちらの方法でOKだったそうです、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問