• 締切済み

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

  • アクセスの集計について

    アクセスのクエリで、伝票番号でグループ化し、その横に、商品番号を並べたいです。 ★元テーブル★(名前:商品テーブル) 伝票番号 商品番号 1163069 AA01232 1168453 AAAA674 1168453 BBBB916 1174348 AA04041 1174348 BB04045 1174348 CC04041 ★作りたい状態★ 伝票番号 新商品番号 1163069 AA01232 1168453 AAAA674、BBBB916 1174348 AA04041、BB04045、CC04041 ★現状★ 伝票番号 新商品番号 1163069 AA01232、AA01232 1168453 AAAA674、BBBB916 1174348 AA04041、CC04041 SQLは、 SELECT 商品テーブル.伝票番号, First([商品番号]) & "、" & Last([商品番号]) AS 新商品番号 FROM 商品テーブル GROUP BY 商品テーブル.伝票番号; です。 first、lastが別に使いたいわけじゃないのですが、 他に方法がわからなくて使いました。 しかし、これだと、2つまでしか表示できないし、1つのものも 2つ表示されてしまって困っています。 わかりにくい質問で申し訳ありませんが、教えてください(^^)

  • ACCESS→SQLServerへ

    現在ACCESS2000で使用しているモジュールを、SQLServer上で動かすことになり、その移植作業で難航しております。皆さんのお知恵をお借りしたく思います。 具体的には重複レコードのあるテーブルから重複を省いたテーブルを作るという処理で、FIRST関数がSQLServerで使えなくて困っています。以下はACCESSでのSQL文です。 INSERT INTO tbl2(fld1,fld2,fld3) SELECT (tbl1.fld1), First(tbl1.fld2) AS fld2の先頭, Count(tbl1.fld3) AS カウント FROM tbl1 GROUP BY tbl1.fld1; よろしくお願いします。

  • SQLServerのGROUP BYについて

    SQLServerでGROUP BYを使用してデータをSELECTする場合について質問があります。 GROUP BYを行う項目に’△△1’と’1△’というデータが入っていた場合、   ※上記の△は半角スペースです。 ’△△1’と’1△’は同じグループとして、グルーピングされるのでしょうか。 Oracleにデータを移行して、GROUP BYをかけると上記のケースはデータ件数が異なります。 これはSQLServerの仕様なのでしょうか。(バージョンは2000です。) お手数ですが、ご教示願います。 

  • アクセスのクエリで集計

    質問です。 ACCESSのクエリで集計(グループ)しようとすると 「’*’で選択したフィールドはグループ化できません」というエラーになります。 とくに”*”で選択しておらず、今まではグループ化できていたのに最近このようなエラーがでます。 どうすれば集計できますでしょうか?

  • SQLServerでの書き方

    二つのテーブルをマージした後に、時間毎の平均値を取得したいのですが SQLServerではどのように書けばよろしいでしょうか? oracleだと↓こんな感じ select ti , avg(va) from ( select date as ti, value as va from test_table union all select date as ti, value as va from test1_table ) group by ti マージしたいテーブルを取得するSQL文をいじらずに実行できる方法を探しています。 以上、宜しくお願いします。

  • GROUP BY句の集計について

    はじめまして。 いろいろ調べて、何度試しても思うように 結果がでなかったので、投稿させて頂きました。 グループの集計をしてるのですが、 何個のグループがあるのかカウントしたいのです。 aaa bbb 110 a 110 b 111 c 112 d というDBに select aaa, bbb, count(*) as cnt from database GROUP BY aaa ORDER BY aaa だとそのグループ内の該当レコード数がカウントされてしまいます。 上記の例だとグループ数が“3”と結果を返すようにしたいのです。 では。宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 重複データの集計方法を教えてください。

    テーブル名:テスト コード SEQ 0001  1 0001  2 0001  3 0002  1 0002  2 0002  3 0003  1 0003  2 0003  3 0003  4 0003  5 0003  6 0003  7 0003  8 0004  1 0004  2 0005  1 0005  2 0005  3 0005  4 0005  5 0005  6 0005  7 0005  8 0006  1 0006  2 0007  1 0007  2 こういったデータのテーブルがあります。 そこで、「コード」の重複件数が6件以下の データを集計したいのです。 これで、重複したコードの件数がでると思うのですが、 SELECT COUNT(コード) FROM テスト GROUP BY コード こういうイメージです。 3 3 8 2 8 2 2 6より多いデータは、6にして、それ以外のデータはそのままの値にしたいのです。 CASE WHEN aa > 6 THEN '6' ELSE aa END 上で書いたSELECTの結果を上記のCASEで使いたいのですが、 どのように記述すればよいのでしょうか? 下記のようにしてもうまくいきませんでした。 SELECT CASE WHEN aa > 6 THEN '6' ELSE aa END FROM (SELECT COUNT(コード) FROM テスト GROUP BY コード) as aa 最終的には、 3 3 6 2 6 2 2 となったものの合計を出したいです。 24がでればいいです。 よろしくお願いします。

  • アクセスクエリ メモ型だとエラーになる

    アクセスのテーブル1(主キーなし)に *********************************************************** フィールド1(メモ型) あああ いいい ううう いいい *********************************************************** と言うデータがあるのですが 「あああ」「ううう」は1個で「いいい」は2つあります。 これを、クエリ1で *********************************************************** SELECT テーブル1.フィールド1, Count(テーブル1.フィールド1) AS フィールド1のカウント FROM テーブル1 GROUP BY テーブル1.フィールド1; *********************************************************** と作り、 新しいクエリで *********************************************************** SELECT テーブル1.フィールド1, クエリ1.フィールド1のカウント FROM テーブル1 INNER JOIN クエリ1 ON テーブル1.フィールド1 = クエリ1.フィールド1; *********************************************************** としたいのですが、 メモ型ではダメなのでしょうか? メモ型でフィールドを宣言しつつ、 このようなクエリを作るにはどうすればいいですか? テキスト型にすると問題なくいけます。

  • クロス集計クエリ

    アクセス2003です。 行見出しフィールドに「10人」となるように、 合計: [Qクエリ]![フィールド] & "人" としたのですが、 "人"が付きません。 (集計方法:カウントです) 不可能なのでしょうか?

  • アクセス:クロス集計の抽出条件-2

    質問No.9247365 で類似した質問をしました。 添付のようなテーブルがあり下記のSQLを実行するとクエリ1になるのですが、カウントに抽出条件を入れてクエリ3のように合計件数が1のものは集計しないようしたいと思います。 下記SQLをどのように直したらよいでしょうか。一つのクエリで行う方法を教えて下さい。 TRANSFORM Count([テーブル1].[くだもの]) AS くだもののカウント SELECT [テーブル1].[くだもの], Count([テーブル1].個数) AS 合計 FROM テーブル1 GROUP BY [テーブル1].[くだもの] PIVOT [テーブル1].月;