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

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

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

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

SQL

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

Q&A

解決済

2回答

5475閲覧

SQL 特定の項目につき一つのレコードを得たい

takingshape

総合スコア10

SQL Server

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

SQL

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

1グッド

0クリップ

投稿2018/06/13 04:27

現在、以下のSQLにて、ECサイトの検索結果ページを表示するためのデータを得ています。
同じ商品コードでも色違いやサイズ違いがあればそれも別レコードとして取得されます。

今回、商品コードごとに1件のレコードとなるようにSQLを変更したいと思いましたが、
以下の状況ではGROUP BY句に集約関数のない項目はすべて含める必要があるようでして、
どのように変更すれば商品コードごとに1件ずつ取得可能か調べてもわかりませんでした。
(SELECTに書かれている項目はすべて必要です)

どうぞよろしくお願いします。

※補足
「T_商品.コード」が商品コードです。
商品コード以外の項目をMAX()などの文字列用の集約関数があれば、是非教えてください。
集約する場合はグループ内の文字列を連結するのではなく、どれか一つを表示したいです。
またコード側で結果を調整するという方法はなしでお願いいたします。

SQL

1SELECT T_商品.コード, T_商品.上代, T_商品色.画像1, T_品目.名称 AS 品目名, T_品目.分類, T_商品.SALE, T_商品.割引率, 2 T_メーカー.ブランド名 AS ブランド, MAX(T_商品色サイズ.入荷日) AS 入荷日, V_商品在庫.在庫数, T_商品色., 3 T_商品色サイズ.サイズ, T_サイズ.名称 AS サイズ名称 4FROM T_商品 INNER JOIN 5 T_品目 ON T_商品.品目 = T_品目.番号 INNER JOIN 6 T_メーカー ON T_商品.メーカー = T_メーカー.番号 INNER JOIN 7 T_商品色 ON T_商品.コード = T_商品色.商品 INNER JOIN 8 T_商品色サイズ ON T_商品.コード = T_商品色サイズ.商品 INNER JOIN 9 V_商品在庫 ON T_商品.コード = V_商品在庫.コード LEFT OUTER JOIN 10 T_サイズ ON T_商品色サイズ.サイズ = T_サイズ.番号 11WHERE (T_商品色.画像1 IS NOT NULL) AND (T_メーカー.ブランド名 IS NOT NULL) 12GROUP BY T_商品.コード, T_商品.上代, T_商品色.画像1, T_品目.名称, T_品目.分類, T_商品.SALE, T_商品.割引率, 13 T_メーカー.ブランド名, V_商品在庫.在庫数, T_商品色., T_商品色サイズ.サイズ, T_サイズ.名称 14ORDER BY 入荷日 DESC, T_商品.コード, T_商品色., T_商品色サイズ.サイズ, T_商品.上代, T_商品色.画像1, 品目名, 15 T_品目.分類, T_商品.SALE, T_商品.割引率, ブランド;";
saitou_san👍を押しています

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

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

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

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

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

ttyp03

2018/06/13 04:40

例えば名称のような文字列などはどのように集約するのでしょうか?一番文字数が多いものを使うとか、全ての文字列を結合するとか。そういったルールの記載がないと答えようがありません。
takingshape

2018/06/13 04:49

説明が足りず失礼いたしました。どれか一つの文字列を使いたいと思っておりますので、結合ではなく、一番文字数が多いものを選ぶ方法でお願いいたします。また他の条件でどれか一つの文字列を選択でき、Group BYからその項目を外せるようでしたら、それでも構いません。どうぞよろしくお願いいたします。
ttyp03

2018/06/13 04:53

とりあえずどれかひとつでいいならMAX()でいいような気がしますが、ダメなんでしょうか?
takingshape

2018/06/13 05:03

すみません、MAX()が文字列も扱えると理解していませんでした..試してみます。ありがとうございます。
guest

回答2

0

ベストアンサー

group by は使用せずにサブクエリーでtop1指定で取り出す。
取り出す順序はサブクエリー内のorder byで指定。
以下例。

SQL

1SELECT コード, 上代 2 ,(select top1 画像1 from T_商品色 where 商品=T_商品.コード order by, 画像1) as 画像1 3from T_商品 4where コード in ( 5 select 商品 FROM T_商品色 where 画像1 IS NOT NULL 6 and メーカー in ( 7 select 番号 from T_メーカー where ブランド名 IS NOT NULL 8 ) 9ORDER BY 入荷日 DESC, コード, 上代, SALE, 割引率

どうしてもgroup byって話なら、STRING_AGGCROSS APPLYの組み合わせ
でゴニョゴニョすることでなんとかなるかもしれないけど、更に複雑になりそう。

投稿2018/06/13 05:23

編集2018/06/13 05:24
sazi

総合スコア25138

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

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

takingshape

2018/06/13 06:35

とてもシンプルに記述できる方法をありがとうございました。 今回先にgroup byを使う方法で始めてしまったので、次回より上記の方法を使ってみたいと思います。 どうもありがとうございました。
guest

0

ベストでは無くかつ汚いのですが、最終的に私が目的を果たせたコードを載せておきます。
どうもありがとうございました。

sql

1SELECT T_商品.コード, MAX(T_商品.上代) AS 上代, MAX(T_商品色.画像1)AS 画像1, MAX(T_品目.名称) AS 品目名, MAX(T_品目.分類)AS 分類, Max(convert(int,T_商品.SALE))AS SALE, Max(convert(int,T_商品.割引率))AS 割引率, 2 MAX(T_メーカー.ブランド名) AS ブランド, MAX(T_商品色サイズ.入荷日) AS 入荷日, MAX(V_商品在庫.在庫数) AS 在庫数, MAX(T_商品色.) AS, 3 MAX(T_商品色サイズ.サイズ) AS サイズ, MAX(T_サイズ.名称) AS サイズ名称 4FROM T_商品 INNER JOIN 5 T_品目 ON T_商品.品目 = T_品目.番号 INNER JOIN 6 T_メーカー ON T_商品.メーカー = T_メーカー.番号 INNER JOIN 7 T_商品色 ON T_商品.コード = T_商品色.商品 INNER JOIN 8 T_商品色サイズ ON T_商品.コード = T_商品色サイズ.商品 INNER JOIN 9 V_商品在庫 ON T_商品.コード = V_商品在庫.コード LEFT OUTER JOIN 10 T_サイズ ON T_商品色サイズ.サイズ = T_サイズ.番号 11WHERE (T_商品色.画像1 IS NOT NULL) AND (T_メーカー.ブランド名 IS NOT NULL) 12GROUP BY T_商品.コード 13ORDER BY T_商品.コード

投稿2018/06/13 06:38

編集2018/06/13 07:19
takingshape

総合スコア10

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

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

sazi

2018/06/13 06:43

order byはmax()で取得した結果に対して行われるので、意図したものでは無い気がします。
takingshape

2018/06/13 06:55

ありがとうございます。私のイメージでは、group byで同じコードのレコードがグループ化されて、その中でmax()が効いており、各グループで取得したmax()結果をorder byにて並べ替えという感じなのですが、あっていますでしょうか。
sazi

2018/06/13 07:16 編集

max()で取得しているものは、order by を指定しても変わりがないということです。 商品ごとのMAX()で取得されるのは1件で、商品コードで並べれば1件のものは順序が変わりようがないので。 例えばある商品について赤と青の色があったとします。 max=order by desc ですけど order by でdescを省略しても結果は変わりません。 order by のT_商品以外の項目が取得に関しての優先度を意図したものであるなら、そのような結果にはなっていないということです。 order by で、T_商品以外の項目を指定していなければ、気にはならないのですが。
takingshape

2018/06/13 07:17

などほど!理解が遅く失礼しました。 上のorder byの所を修正しておきます。 どうもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問