• 締切済み

sqlserverにはグループ集計のfirstとlastがありません??

accessユーザーです sqlserverに組み替えているなかでaccessでは今までグループ集計をクエリーで作成していました select first(フィールド1) as AA,last(フィールド2) as BB  from FFテーブル group by フィールド3 ところがsqlserverにはfirstとlastがありません?? どのようにすればよいのかご教授おねがいします firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。 よろしくおねがいします

みんなの回答

回答No.3

#1回答者です。 #2回答者さんの回答を見て、私もaccessの仕様に驚きました。階層DB的な発想ですね。 ところでSQL Serverのバージョンは、何でしょうか? #2回答者さんの使用している「select ~ from (select ~ from ~ ) as 別名」は、インラインビューというもので、SQL Server 2000では未サポートです。 http://www.microsoft.com/japan/sql/prodinfo/compare/prk/vsOracle4_7.mspx もし、SQL Server 2005なら、#2さんのSQLに加え、以下のような分析関数という機能を使うことでも実現可能です。 select フィールド1,フィールド2,F.フィールド3 from (select rank() over(partition by フィールド3 order by id) as F_row, フィールド1,フィールド3 from FFテーブル) as F, (select rank() over(partition by フィールド3 order by id desc) as L_row, フィールド2,フィールド3 from FFテーブル) as L where F.フィールド3=L.フィールド3 and F_row=L_row and F_row=1;

hiyotom
質問者

お礼

返事送れてすみませんでした バージョンはSQL Server 2005standerd版ですので 早速ご指摘どうりにやってみます ありがとうございました 今後ともよろしくおねがいします

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

http://www.microsoft.com/japan/technet/prodtechnol/sql/70/deploy/access.mspx#EBGAC こちらの情報によると、SQLServerにはfirst、lastはありません。 また、一般的にデータベースでは登録したデータの順番は記録しません。 例えば、Order Byで並び順を指定せず、SELECT文でレコードを選択した場合、 その並び順は不定になります。 (仮に登録順で表示されたとしても、それは保障されていません。) 登録順で並べたり、最後に登録したデータを取り出す等は出来ません。 登録順での操作が必要な場合、フィールドを追加し、 オートナンバー等で何らかの記録を残しておく必要があります。 言ってしまえば、Accessのfirstとlastが特殊なんです。 Access以外では使えないと思って頂いてよいと思います。 こちらの情報なども、参考にどうぞ http://blackbird.cocolog-nifty.com/progtalk/2004/11/sqllast.html http://support.microsoft.com/default.aspx?scid=kb;ja;208190 >firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。 オートナンバーのフィールドを追加し、IDとします。 ------------------------ SELECT F1.フィールド1, L2.フィールド2, F1.フィールド3 FROM ( SELECT X.フィールド1, X.フィールド3 FROM FFテーブル AS X INNER JOIN ( SELECT Min(F.ID) AS FirstID, F.フィールド3 FROM FFテーブル AS F GROUP BY F.フィールド3 ) AS F ON F.FirstID = X.ID ) AS F1 INNER JOIN ( SELECT X.フィールド2, X.フィールド3 FROM FFテーブル AS X INNER JOIN ( SELECT Max(L.ID) AS LastID, L.フィールド3 FROM FFテーブル AS L GROUP BY L.フィールド3 ) AS L ON L.LastID = X.ID ) AS L2 ON F1.フィールド3 = L2.フィールド3; ------------------------ 長いですが、1つのSQL文です。(^^; これで期待どうりの結果になってるでしょうか? (Accessで動作確認しましたが、SQLServerでは確認してません。)

hiyotom
質問者

お礼

ありがとうございました 今日、私も考えてフィールドIDはオートナンバーですのでmax(フィールドID)として別のファイルにオートナンバーではないフィールドID2を作成しinsertで別のファイルのID2と基のオートナンバーIDをkeyにしてフィールド2をupdateすればイメージどうりにできました 返信の記述も明日試してみますありがとうございました 今後ともご教授よろしくお願いします

回答No.1

FIRST、LASTがACCESSではどういう機能なのかを説明するか、基の表と得たい結果を示してくれれば、回答が得られやすいと思います。 また、SQL Serverのバージョンも、できれば示してください。 firstとlastは、minとmaxで置き換えられるのではないでしょうか? select min(フィールド1) as AA,max(フィールド2) as BB from FFテーブル group by フィールド3

hiyotom
質問者

お礼

ありがとうございました 今日、私も考えてフィールドIDはオートナンバーですのでmax(フィールドID)として別のファイルにオートナンバーではないフィールドID2を作成しinsertで別のファイルのID2と基のオートナンバーIDをkeyにしてフィールド2をupdateすればイメージどうりにできました 返信の記述も明日試してみますありがとうございました 今後ともご教授よろしくお願いします

hiyotom
質問者

補足

早速返事ありがとうございます たとえばlast(フィールド2) as BBのフィールド2の内容がアルファベットで文字の場合なんです!groupのフィールド3が数字であったとして フィールド2-----------フィールド3------------------ ----A---------------------2------------------------ ----C---------------------2------------------------ ----B---------------------2------------------------ この場合MINですとAになってしまいますMAXだとCになってしまいます ほしいのは最後のBです

関連するQ&A