こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL Server を使っています。SQLの質問です。

SQL Server を使っています。SQLの質問です。
得意先テーブルと商品テーブルと売上明細テーブルがあります。
一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて
います。


■売上明細データ
明細ID (meisai_id)
得意先ID (tokuisaki_id)
商品ID  (syohin_id)
売上金額(uriage_kingaku)
売上日 (uriage_date)


■売上明細データ(table_uri_maisai)
meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date =================================================================
  1     aaa     001     100     2010/01/01
  2     aaa     002     200     2010/01/01
  3     bbb     001     105     2010/01/02
  4     bbb     002     205     2010/01/02
  5     ccc     001     110     2010/01/03
  6     ccc     002     210     2010/01/03
  7     aaa     001     100     2010/01/04
  8     aaa     002     200     2010/01/04
  9     bbb     001     105     2010/01/05
  10     bbb     002     205     2010/01/05
  11     ccc     001     110     2010/01/06
  12     ccc     002     210     2010/01/06


上のような明細があり、「syohin_id」が「001」のデータに関して、
得意先ごとの最新のデータだけを抽出したいと考えています。
この場合ですと、以下の3件のデータが抽出できればよいわけです。

  7     aaa     001     100     2010/01/04
  9     bbb     001     105     2010/01/05
  11     ccc     001     110     2010/01/06



tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには
以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを
出すことがどうしてもできません。

SELECT *
FROM
table_uri_meisai
WHERE uriage_date =
(select max(uriage_date)
FROM
table_uri_meisai
WHERE
tokuisaki_id = 1
AND
syohin_id = 1)
AND
tokuisaki_id = 1
AND
syohin_id = 1


どなたかご指導ください。
よろしくお願いします。

投稿日時 - 2010-06-06 15:24:50

QNo.5948932

困ってます

質問者が選んだベストアンサー

#1です。訂正します。

SELECT t1.*
FROM table_uri_meisai t1,
 (select tokuisaki_id, max(uriage_date) saisin
 FROM table_uri_meisai
 WHERE syohin_id = 1
 GROUP BY tokuisaki_id) t2
WHERE t1.tokuisaki_id = t2.tokuisaki_id
AND t1.syohin_id = 1
AND t1.uriage_date = t2.saisin
ORDER BY t1.meisai_id

商品ID=1以外も欲しいなら、

SELECT t1.*
FROM table_uri_meisai t1,
 (select tokuisaki_id, syohin_id, max(uriage_date) saisin
 FROM table_uri_meisai
 GROUP BY tokuisaki_id, syohin_id) t2
WHERE t1.tokuisaki_id = t2.tokuisaki_id
AND t1.syohin_id = t2.syohin_id
AND t1.uriage_date = t2.saisin
ORDER BY t1.meisai_id
(ORDER BY は適宜修正のこと)

投稿日時 - 2010-06-06 16:12:09

お礼

ほんとに早い回答、ありがとうございました。

使っているのは MS SQL Server ですが、
教えていただいたとおりやってみたところできました。
本当にありがとうございます。

ところで、今後のこともあって教えてもらいたいのですが、
「t1」とか「t2」とはどんな意味があったり、役割があるんでしょうか。

まだ初心者なんですが、自習した中でも「t1」や「t2」にあたるものは
今まで見たことありませんでした。

ついでに教えて下さい。
よろしくお願いします。

投稿日時 - 2010-06-06 16:30:05

このQ&Aは役に立ちましたか?

18人が「このQ&Aが役に立った」と投票しています

回答(3)

t1とかt2について

これらは「alias」と言って、長いテーブル(またはテーブルと同じ働きと考えられるもの)に
対する別名です。
他にも列名に対しても使えます。

例.
select publish,max(price) as 最大値,min(price) as 最小値 from dbo.book group by publish

このように使うと(上で「最大値」「最小値」が列に付けたaliasです)

publish   最大値 最小値
1 インプレス 3129 2625
2 秀和システム 3360 2520
3 翔泳社 4179 2940

のように出力されます。
また、同じテーブルでも別扱いできます。このことによって
自分自身のテーブルとの結合ができます。

投稿日時 - 2010-06-06 16:54:37

お礼

普通「as」をつけて使うエイリアスですね。
「as」を略して使うこともできるんですね。

丁寧に教えていただき、ありがとうございました。

投稿日時 - 2010-06-06 18:45:45

ANo.1

Oracleだったらこんな感じ(無試験ですが)

SELECT t1.*
FROM table_uri_meisai t1,
 (select tokuisaki_id, max(uriage_date) saisin
 FROM table_uri_meisai
 WHERE syohin_id = 1
 GROUP BY tokuisaki_id) t2
WHERE t1.tokuisaki_id = t2.tokuisaki_id
AND t1.uriage_date = t2.saisin
ORDER BY t1.meisai_id


商品IDを変更する場合は、t2の中を修正のこと。

投稿日時 - 2010-06-06 16:01:24