• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:最大値のデータ行の取得について)

最大値のデータ行の取得について

このQ&Aのポイント
  • テーブル1:STAFF(社員テーブル)とテーブル2:ATT(異動履歴テーブル)、テーブル3:SEC(部署テーブル)の結合により、最大(最新)の異動履歴レコードNo.に関連する異動履歴レコードNo.、社員コード、部署コードを取得したい。
  • 類似の質問で「GROUP BY」を利用することを試みましたが、期待する結果が得られませんでした。
  • 現在、部署コードまでグループ化しており、解決策がわからないため、質問させていただいています。

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

  • ベストアンサー
回答No.3

すみません、動作確認していなかったので、間違いがあるようです。 まず、質問のSQL文の場合ATT.AttRecは最大値ですが、StaffCodeとSecCodeでグループ化しているので、StaffCodeとSecCodeが同じ場合のAttRecの最大値となってしまいます。 そこで最初のSELECTでは、テーブルの内容をそのまま表示するようにして、ATT.AttRecが最大である物のみ選択してあげれば解決します。 私の回答の場合条件が一致した全てのAttRecの最大値のみと比較しているので、答えは1件のみになってしますと思います、今回のSQLも動作確認はしていないので、まだミスが有るかはしれませんが、一応回答します。6行目に最初のテーブルとの一致条件を追加しました。 SELECT ATT.AttRec, STAFF.StaffCode, SEC.SecCode FROM PJK0001.dbo.ATT ATT, PJK0001.dbo.SEC SEC, PJK0001.dbo.STAFF STAFF WHERE ATT.AttStaffRec = STAFF.StaffRec AND ATT.AttSecRec = SEC.SecRec AND ATT.AttRec=(SELECT MAX(ATT2.AttRec) FROM PJK0001.dbo.ATT ATT2, PJK0001.dbo.SEC SEC2, PJK0001.dbo.STAFF STAFF2 WHERE ATT2.AttStaffRec = STAFF2.StaffRec AND ATT2.AttSecRec = SEC2.SecRec AND ATT.AttStaffRec = ATT2.AttStaffRec AND ATT.AttSecRec = ATT2.AttSecRec )

YYKK8419
質問者

お礼

自宅でテストできる環境が無く返事遅くなり申し訳ありませんでした。 教えて頂いたコードを参考に以下のようにしてうまく出来ました。 SELECT ATT.AttRec, STAFF.StaffCode, SEC.SecCode FROM PJK0001.dbo.ATT ATT, PJK0001.dbo.SEC SEC, PJK0001.dbo.STAFF STAFF WHERE ATT.AttStaffRec = STAFF.StaffRec AND ATT.AttSecRec = SEC.SecRec AND ATT.AttRec=(SELECT MAX(ATT2.AttRec) FROM PJK0001.dbo.ATT ATT2, PJK0001.dbo.STAFF STAFF2 WHERE ATT2.AttStaffRec = STAFF2.StaffRec AND ATT.AttStaffRec = ATT2.AttStaffRec GROUP BY STAFF2.StaffCode ) 大変助かりました。ありがとうございます。

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

SQL SERVER 2005以降なら select ATT2.AttRec, STAFF.StaffCode, SEC.SecCode from ( select AttRec,AttStaffRec,AttSecRec, row_number() over(partition by AttStaffRec order by AttRec desc) as rn from ATT ) as ATT2 join STAFF on ATT2.AttStaffRec = STAFF.StaffRec and ATT2.rn = 1 join SEC on ATT2.AttSecRec = SEC.SecRec でもいけるかもしれません。

YYKK8419
質問者

お礼

ありがとうございます。 SQLのバージョンは分からないのですが、実行したところエラーとなりました。 エラー:「テーブル'('を追加できません。」 やはりバージョンが違うので対応していないのでしょうか。

回答No.1

動作確認はしてありませんが、以下のようにすれば良いと思います。 SELECT ATT.AttRec, STAFF.StaffCode, SEC.SecCode FROM PJK0001.dbo.ATT ATT, PJK0001.dbo.SEC SEC, PJK0001.dbo.STAFF STAFF WHERE ATT.AttStaffRec = STAFF.StaffRec AND ATT.AttSecRec = SEC.SecRec AND ATT.AttRec=(SELECT MAX(ATT2.AttRec) FROM PJK0001.dbo.ATT ATT2, PJK0001.dbo.SEC SEC2, PJK0001.dbo.STAFF STAFF2 WHERE ATT2.AttStaffRec = STAFF2.StaffRec AND ATT2.AttSecRec = SEC2.SecRec)

YYKK8419
質問者

お礼

回答ありがとうございます。 実行してみたのですがエラーが出てしまいました。 「SQLクエリを実行できません。再表示しますか?」 実行してみた結果AttRecの最大値のみ表示されました。 これは私の質問の仕方が悪かったのですが、欲しい結果は 各社員の最新の部署コードが欲しいと思っています。 その場合「GROUP BY 」というのを利用するのでしょうか? 教えていただいたコードを自分なりに考えてみようとしたのですが、 「AND ATT.AttRec=(SELECT MAX(ATT2.AttRec)」以降の意味が分かるず 自己解決できませんでした。 お手数ですがもう一度教えていただけないでしょうか?