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

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

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

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

Q&A

解決済

1回答

651閲覧

他のテーブルに定義した置換パターンによる置換、表示フラグによる表示ONOFF

tokita.

総合スコア61

SQL Server

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

0グッド

0クリップ

投稿2021/07/19 01:57

編集2021/07/19 06:20

お世話になっております。
いま、テーブル1とテーブル2があります。

テーブル1.就業日報

社員番号実事由備考
1有休通院のため
2午前休,直行取引先A
3欠勤私用
4出張取引先B

テーブル2.実事由一覧

実事由表示名備考非表示
有休休暇true
欠勤休暇true
午前休AM休true
直行出張false
出張出張false

ここで、次のビューを作りたいです。(ssmsで作成したいです。)

  • テーブル1を元にしたもの
  • テーブル1の「実事由」を「実事由一覧」テーブルの実事由フィールドから表示名フィールドに置換
  • テーブル1の「実事由」のうち「実事由一覧」にて備考非表示をtrueに設定している要素が一つでもある場合、備考を空欄にする

具体的には、次のような形です。

希望のビュー

社員番号事由備考
1休暇
2AM休,出張
3休暇
4出張取引先B

ここで次のようなことはできますでしょうか。
0. テーブル2の実事由と表示名を基にテーブル1の実事由を置換すること
(テーブル1の実事由に1フィールド1事由しかなければ、left joinでできるのですが、社員番号2のようなケースが避けられないです)

  1. テーブル2の実事由と備考非表示を基にテーブル1の備考を表示/非表示すること

(上同様に、1フィールド1事由であればleft joinしてiifでできるのですが…)

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

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

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

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

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

sazi

2021/07/19 06:22 編集

> テーブル2の実事由と備考非表示を基にテーブル1の備考を表示/非表示すること 事由が複数の時、非表示が一つでもあれば非表示という事ですか? また、 > ビューを作りたいです。 create viewしたいという事ですか? > ssmsで作成したいです。 答えになっていませんが、問い合わせのSQLという事だと解釈しました。
tokita.

2021/07/19 07:03

>> テーブル2の実事由と備考非表示を基にテーブル1の備考を表示/非表示すること >事由が複数の時、非表示が一つでもあれば非表示という事ですか? はい、そうです。 また、 >> ビューを作りたいです。 >create viewしたいという事ですか? SSMSでそういうビューを作って見れる状態にしたいという意図です。
guest

回答1

0

ベストアンサー

1フィールド1事由であればleft joinしてiifでできるのですが

STRING_SPLITを利用すると、表に展開できます。
これをAPPLY 演算子で繋ぐと実事由を分解した形が展開できますので、加工すれば良いかと思います。

SQL

1select 就業日報.*, value as 単実事由 2from 就業日報 OUTER APPLY STRING_SPLIT(実事由, ',')

投稿2021/07/19 06:42

編集2021/07/19 07:12
sazi

総合スコア25327

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

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

tokita.

2021/07/20 01:35

回答ありがとうございます。とりあえずできました ビュー:習作1 ```SQL SELECT 就業日報.*, value as 単実事由,表示名, 備考非表示 FROM 就業日報 OUTER apply STRING_SPLIT(実事由, ',') s LEFT JOIN 実事由一覧 AS c ON c.実事由 = s.value ``` ビュー:習作2 ```SQL SELECT 社員番号, string_agg(表示名, ',') AS 事由, iif((CHARINDEX('1', string_agg(備考非表示, ',')))>0,'',備考) AS 備考 FROM dbo.習作1 GROUP BY 社員番号,備考 ``` これの実現のために習作1という作業途中のビューを作らないとうまく動きませんでした。 習作1のSQLをかっこで囲んだものを習作2のFROMのサブクエリとして入れれば動くかと思っていたのですが。。 こちら1つのビューで実現する方法はございますでしょうか。
sazi

2021/07/20 02:24 編集

以下ではどうでしょうか SELECT 社員番号, string_agg(c.表示名, ',') AS 事由, iif((CHARINDEX('1', string_agg(c.備考非表示, ',')))>0,'', s.備考) AS 備考 FROM ( SELECT 就業日報.*, value FROM 就業日報 OUTER apply STRING_SPLIT(実事由, ',') ) s LEFT JOIN 実事由一覧 AS c ON c.実事由 = s.value GROUP BY 社員番号, 備考
sazi

2021/07/20 02:26

若しくは with 習作1 as ( SELECT 就業日報.*, value as 単実事由,表示名, 備考非表示 FROM 就業日報 OUTER apply STRING_SPLIT(実事由, ',') s LEFT JOIN 実事由一覧 AS c ON c.実事由 = s.value ) SELECT 社員番号, string_agg(表示名, ',') AS 事由, iif((CHARINDEX('1', string_agg(備考非表示, ',')))>0,'',備考) AS 備考 FROM 習作1 GROUP BY 社員番号,備考
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問