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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

158閲覧

SQL server UNION ALL 簡潔な結合の方法

s_hotate_s

総合スコア1

SQL Server

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2024/04/30 00:44

編集2024/04/30 01:07

実現したいこと

SQL文をより簡潔化し、上平均、下平均、平均を容易に確認できるviewを作成したいです。


実行日から過去半年間を明細として表示
それらの平均値が下平均
実行日から7~12カ月前が上平均
12カ月前からのものが平均

それぞれ別々のSQLで作成し、UNION ALLで結合しました。

発生している問題・分からないこと

SQL初心者です。おかしい質問や必要な情報が足りない等あるかと存じます。
申し訳ございませんがその際はご指導いただけますと幸いです。

<マスタ項目については、トランザクションのunion allの結果に対して結合するときれいです。>

上記のご指導を頂きました。この内容が理解できず、恐れ入りますが教えていただけますと幸いです。

該当のソースコード

SQLSERVER

1 SELECT TZ.[組織コード] 2 , TZ.[倉庫コード] 3 , SKM.[倉庫名] 4 , TZ.[品目コード] 5 , HM.[品目名1] 6 , HM.[品目名2] 7 , TZ.[対象年月] 8 , TZ.[売上数] 9FROM [yoshimei].[dbo].[TT_月別在庫] TZ 10INNER JOIN [yoshimei].[dbo].[TM_品目マスタ] HM 11 ON TZ.[品目コード] = HM.[品目コード] 12LEFT JOIN [yoshimei].[dbo].[TM_倉庫マスタ] SKM 13 ON TZ.[倉庫コード] = SKM.[倉庫コード] 14 WHERE TZ.[対象年月]BETWEEN 15 [dbo].[fn_会計年月](dateadd(m,-6,GETDATE())) AND [dbo].[fn_会計年月](GETDATE()) 16UNION ALL 17SELECT TZ.[組織コード] 18 ,TZ.[倉庫コード] 19 , SKM.[倉庫名] 20 , TZ.[品目コード] 21 , HM.[品目名1] 22 , HM.[品目名2] 23 ,'上平均' 24 , AVG(TZ.[売上数]) 25FROM [yoshimei].[dbo].[TT_月別在庫] TZ 26INNER JOIN [yoshimei].[dbo].[TM_品目マスタ] HM 27 ON TZ.[品目コード] = HM.[品目コード] 28LEFT JOIN [yoshimei].[dbo].[TM_倉庫マスタ] SKM 29 ON TZ.[倉庫コード] = SKM.[倉庫コード] 30 WHERE TZ.[対象年月]BETWEEN 31 [dbo].[fn_会計年月](dateadd(m,-12,GETDATE())) AND 32 [dbo].[fn_会計年月](dateadd(m,-7,GETDATE())) 33 GROUP BY TZ.[組織コード],TZ.[倉庫コード], SKM.[倉庫名], TZ.[品目コード], HM.[品目名1] , HM.[品目名2] 34UNION ALL 35 SELECT TZ.[組織コード] 36 , TZ.[倉庫コード] 37 , SKM.[倉庫名] 38 , TZ.[品目コード] 39 , HM.[品目名1] 40 , HM.[品目名2] 41 ,'下平均' 42 , AVG(TZ.[売上数]) 43FROM [yoshimei].[dbo].[TT_月別在庫] TZ 44INNER JOIN [yoshimei].[dbo].[TM_品目マスタ] HM 45 ON TZ.[品目コード] = UKM.[品目コード] 46LEFT JOIN [yoshimei].[dbo].[TM_倉庫マスタ] SKM 47 ON TZ.[倉庫コード] = SKM.[倉庫コード] 48 WHERE TZ.[対象年月]BETWEEN 49 [dbo].[fn_会計年月](dateadd(m,-6,GETDATE())) AND [dbo].[fn_会計年月](GETDATE()) 50 GROUP BY TZ.[組織コード],TZ.[倉庫コード], SKM.[倉庫名], TZ.[品目コード], HM.[品目名1] , HM.[品目名2] 51UNION ALL 52 SELECT TZ.[組織コード] 53 , TZ.[倉庫コード] 54 , SKM.[倉庫名] 55 , TZ.[品目コード] 56 , HM.[品目名1] 57 , HM.[品目名2] 58 ,'平均' 59 , AVG(TZ.[売上数]) 60FROM [yoshimei].[dbo].[TT_月別在庫] TZ 61INNER JOIN [yoshimei].[dbo].[TM_品目マスタ] HM 62 ON TZ.[品目コード] = HM.[品目コード] 63LEFT JOIN [yoshimei].[dbo].[TM_倉庫マスタ] SKM 64 ON TZ.[倉庫コード] = SKM.[倉庫コード] 65 WHERE TZ.[対象年月]BETWEEN 66 [dbo].[fn_会計年月](dateadd(m,-12,GETDATE()))AND [dbo].[fn_会計年月](GETDATE()) 67 GROUP BY TZ.[組織コード],TZ.[倉庫コード], SKM.[倉庫名], TZ.[品目コード], HM.[品目名1] , HM.[品目名2] 68

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

調べたのですが、
トランザクションデータ(売上数など)を「union all」で結合します。その結果を基に、マスタデータ(組織コード、倉庫コード、品目コードなど)を結合すると、データがきれいに整理され、処理も効率的になります。
上記回答では私の頭では理解できず。。。申し訳ございませんが猿でもわかるように教えていただけますと幸いです。

補足

特になし

takanaweb5👍を押しています

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

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

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

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

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

s_hotate_s

2024/04/30 01:02

ご回答、ご指導ありがとうございます。 わかりづらい質問文となっており申し訳ございません。
guest

回答1

0

ベストアンサー

業務の詳細やテーブル定義などが不明なため、憶測が多分に交じりますが、SQLを見る限りでは、「上平均、下平均、平均」はTT_月別在庫テーブル単体から導出可能であるようです (提示していただいたSQLでは「上平均、下平均、平均」を求めるのに、TM_品目マスタテーブルとTM_倉庫マスタを結合している)

指摘者の意図については完全にはわかりかねますが、以下のようなSQLのつくりにしてほしかったのではないでしょうか?

  1. TT_月別在庫テーブル から「上平均、下平均、平均」を導出する。導出結果をXとする
  2. XにTM_品目マスタテーブルとTM_倉庫マスタを結合する

SQL

1SELECT 2 X.[組織コード] 3 , X.[倉庫コード] 4 , SKM.[倉庫名] 5 , X.[品目コード] 6 , HM.[品目名1] 7 , HM.[品目名2] 8 , X.[対象年月] 9 , X.[売上数] 10FROM ( 11 SELECT TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード], TZ.[対象年月], TZ.[売上数] 12 FROM [yoshimei].[dbo].[TT_月別在庫] TZ 13 WHERE TZ.[対象年月] BETWEEN [dbo].[fn_会計年月](dateadd(m,-6,GETDATE())) AND [dbo].[fn_会計年月](GETDATE()) 14 UNION ALL 15 SELECT TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード], '上平均', AVG(TZ.[売上数]) 16 WHERE TZ.[対象年月] BETWEEN [dbo].[fn_会計年月](dateadd(m,-12,GETDATE())) AND [dbo].[fn_会計年月](dateadd(m,-7,GETDATE())) 17 GROUP BY TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード] 18 UNION ALL 19 SELECT TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード], '下平均', AVG(TZ.[売上数]) 20 WHERE TZ.[対象年月] BETWEEN [dbo].[fn_会計年月](dateadd(m,-6,GETDATE())) AND [dbo].[fn_会計年月](GETDATE()) 21 GROUP BY TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード] 22 UNION ALL 23 SELECT TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード], '平均', AVG(TZ.[売上数]) 24 WHERE [dbo].[fn_会計年月](dateadd(m,-12,GETDATE()))AND [dbo].[fn_会計年月](GETDATE()) 25 GROUP BY TZ.[組織コード], TZ.[倉庫コード], TZ.[品目コード] 26) AS X 27JOIN INNER JOIN [yoshimei].[dbo].[TM_品目マスタ] HM ON X.[品目コード] = HM.[品目コード] 28LEFT JOIN [yoshimei].[dbo].[TM_倉庫マスタ] SKM ON X.[倉庫コード] = SKM.[倉庫コード]

投稿2024/04/30 01:43

neko_the_shadow

総合スコア2273

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

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

s_hotate_s

2024/04/30 01:57

回答ありがとうございます。 質問文がわかりづらい中、ご丁寧にありがとうございます。 指示を出された際、サブクエリを使用するということをすぐに導き出せない能力の低さ、まだまだ学習が足りていないと感じました。 自分にしっかりと落とし込みフィードバックさせていただきます。 本当にありがとうございます。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問