- PR -

すいません。SQL構文の質問です。

投稿者投稿内容
あやこ
会議室デビュー日: 2005/10/13
投稿数: 13
投稿日時: 2005-12-06 20:44
こんばんは。
すいません。初心者のSQL構文の質問です。
データベースはSQLServer2000です。

ID|DATA|日付
1 |AA |2005/12/01
2 |BB |2005/12/03
1 |CC |2005/12/04
1 |DD |2005/12/06
2 |EE |2005/12/02

のようなテーブルから、
ID毎に日付が一番新しいレコードだけを取り出したいと思っています。

ID|DATA|日付
1 |DD |2005/12/06
2 |BB |2005/12/03

という結果を取得したいのです。
幾つかのテーブルから値をひっぱてきて、
何とか上のテーブルのようにすることまではできたのですが、
そこから先がわからなくて。
「SQLを質問される方へのアドバイス」
のスレッドに書いてあるとおり、本来なら自己解決しなくてはいけないのですが、
どうにも出来ないので、質問させて頂きました。
どうか、よろしくお願いいたします。


ミソジマエ
常連さん
会議室デビュー日: 2005/09/25
投稿数: 43
投稿日時: 2005-12-06 20:59
これが参考になりますよ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19846&forum=26
あやこ
会議室デビュー日: 2005/10/13
投稿数: 13
投稿日時: 2005-12-06 22:25
ご返答ありがとうございます。
紹介していただいたスレッド、大変勉強になりました。
スレッド内にあるNAOさんの

SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード)

構文を参考にさせて頂いているのですが、
ちょうど「テーブル名」の部分が(SELECT 〜 ) AS TABLE になっていまして、
どうもうまくいきません。
これだけ明快な構文があるので、わかる人にはすぐにわかるのでしょうが、
私は、頭の回転がよくないので、応用しきれずにこんがらがっています。
情けないです・・・。
ミソジマエ
常連さん
会議室デビュー日: 2005/09/25
投稿数: 43
投稿日時: 2005-12-07 09:12
うまくいかないというのはどういうことなんでしょうか?
エラーが出るということでしょうか?
それとも思ったとおりの抽出ができないということでしょうか?
うまくいかない内容を書かないと他の人には伝わりませんよ?
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2005-12-07 09:35
おはようございます。

コード:
SELECT A.*
FROM テーブル名 別名A
    INNER JOIN (
        SELECT ID,MAX(日付) AS 日付
        FROM テーブル名 
        GROUP BY ID
    ) B 
    ON A.ID = B.ID AND A.日付 = B.日付


他にも書き方はあると思いますが、とりあえず思いついたのはこんなかんじです。
検証してないのでちょっと自信はないですが・・・
サブクエリはいろいろな使い方ができます。工夫して使いましょう。
らい
大ベテラン
会議室デビュー日: 2005/08/02
投稿数: 159
お住まい・勤務地: 東京都と千葉県のさかいめ
投稿日時: 2005-12-07 09:46
らいと申します。

引用:

あやこさんの書き込み (2005-12-06 22:25) より:
スレッド内にあるNAOさんの

SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード)

構文を参考にさせて頂いているのですが、


上記構文を使用しているのであれば、できるはずです。

引用:

ちょうど「テーブル名」の部分が(SELECT 〜 ) AS TABLE になっていまして、
どうもうまくいきません。


……?
とりあえず、なぜ「AS TABLE」が出てくるかわかりません。
テーブル名ではないでしょうし。
もしかして、既存のSQL式を変換しようとしてます?
であれば、それも出してもらえないと
ちゃんとした回答をすることができません。

で、とりあえず。
一番初めに出されたもの(DBの中身)を実現するSQL式は、以下のとおり。
# テーブル名はテキトーなので、付け替えてくださいね。
# 一応下では「AAA」という名前で書いてあります。

コード:

SELECT * FROM AAA A01  --A01は、テーブルの別名
WHERE 日付=
(
SELECT Max(日付) FROM AAA
WHERE ID=A01.ID
)


では。

_________________
一寸先は闇
安定してるシステムって言ったじゃん(泣)
あやこ
会議室デビュー日: 2005/10/13
投稿数: 13
投稿日時: 2005-12-07 10:50
おはようございます。

SELECT〜の中身は、

SELECT
M_営業先.営業先ID, データNo, M_営業先.業種区分ID, M_営業先.都道府県ID,
M_営業先.市区町村ID, 営業データ.関心度ID,
施設名, 施設名, 郵便番号, 住所, TEL,
FAX, 担当者, MAIL,
ISNULL(PREF.都道府県正式名,'') AS 都道府県,
ISNULL(CITY.市区町村名,'') AS 市区町村,
ISNULL(KIND.業種名,'') AS 業種名,
ISNULL(RES.関心度,'') AS 関心度,
メモ,
REPLACE(CONVERT(VARCHAR,CAST(ISNULL(販売数量,0) AS MONEY),1),'.00','') AS 販売数量,
REPLACE(CONVERT(VARCHAR,CAST(ISNULL(販売金額,0) AS MONEY),1),'.00','') AS 販売金額,
ISNULL(CONVERT(VARCHAR,(CONVERT(VARCHAR,DATEPART(yyyy,日付)) + '/' +
RIGHT('0' + CONVERT(VARCHAR,DATEPART(mm,日付)), 2) + '/' +
RIGHT('0' + CONVERT(VARCHAR,DATEPART(dd,日付)), 2))),'') AS 日付
FROM 営業データ
LEFT JOIN M_営業先
ON (営業データ.営業先ID = M_営業先.営業先ID)
LEFT JOIN
(
SELECT 都道府県正式名, 営業先ID
FROM M_営業先
LEFT JOIN M_都道府県
ON (M_営業先.都道府県ID = M_都道府県.都道府県ID)
WHERE M_都道府県.削除フラグ = 0
) AS PREF
ON (営業データ.営業先ID = PREF.営業先ID)
LEFT JOIN
(
SELECT 市区町村名, 営業先ID
FROM M_営業先
LEFT JOIN M_市区町村
ON (M_営業先.市区町村ID = M_市区町村.市区町村ID)
WHERE M_市区町村.削除フラグ = 0
) AS CITY
ON (営業データ.営業先ID = CITY.営業先ID)
LEFT JOIN
(
SELECT 業種名, 営業先ID
FROM M_営業先
LEFT JOIN M_業種
ON (M_営業先.業種区分ID = M_業種.業種区分ID)
WHERE M_業種.削除フラグ = 0
) AS KIND
ON (営業データ.営業先ID = KIND.営業先ID)
LEFT JOIN
(
SELECT 関心度, 関心度ID
FROM M_関心度
WHERE 削除フラグ = 0
) AS RES
ON (営業データ.関心度ID = RES.関心度ID)
WHERE 営業データ.削除フラグ = 0

になっています。
それを全体でくくって、
(SELECT * FROM 〜) AS TABLE
にしてやってみています。
「TABLE」と書いたために、余計に皆さんにご迷惑をおかけしたのかもしれません。
すいません。
けして、
SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード)
が間違っていると言っているのではないです。
ごめんなさい。
>うまくいかない内容を書かないと他の人には伝わりませんよ?
そのとおりですね。
エラーが出てしまいます。
多分カッコの括りとか、そんな単純な間違いだと思うのですが、
小心者ですので、追い込まれてテンパってしまっています。
他のスレッドなどを見ていると凄く高度な質問が多くて、
こんな質問でスレッドを立てたら、迷惑がられるかなと思っていたのですが、
みなさんが凄く親切に返答をして下さるので、大変感謝しております。
今後もよろしくお願いいたします。





ミソジマエ
常連さん
会議室デビュー日: 2005/09/25
投稿数: 43
投稿日時: 2005-12-07 11:25
エラーが出ているのであれば、おそらく記述ミスなんでしょうね。
例を元にするとこんな感じになりそうですね。
SELECT * FROM (SELECT 〜) as TABLE1 WHERE 取引日付=(SELECT MAX(日付) FROM (SELECT 〜) as TABLE2 WHERE TABLE2.ID=TABLE1.ID)

スキルアップ/キャリアアップ(JOB@IT)