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

解決済みの質問

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;

よろしくお願いします。

投稿日時 - 2005-04-25 11:35:35

QNo.1351003

すぐに回答ほしいです

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

これでいけるでしょう。

INSERT INTO tbl2(fld1,fld2,fld3)
select Q.fld1,(select top 1 fld2 from tbl1 T1
where T1.fld1 = Q.fld1 order by T1.キーとなる項目),Q.count_fld3
from (select fld1,count(fld3) as count_fld3 from tbl1 group by fld1) Q

投稿日時 - 2005-04-26 01:09:17

お礼

なるほどtopを使えばいいんですね。大変参考になりました。ありがとうございました。

投稿日時 - 2005-04-26 10:08:29

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

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

回答(4)

#2です
まず重複のないように tbl2 に出力し、その後集計関数を使用して UPDATE するのではまずいのでしょうか。

また最初から GROUP BY でやるとして First ではなく Min などでは駄目ですか?

投稿日時 - 2005-04-25 17:16:46

補足

レコード件数が数万件あるため、insertとupdateを分けてしまうと、ユニークなフィールドを使って数万回updateしないとならないために1つのSQL文で処理をしようとしています。

Min関数は最小値を求めるため、期待値の先頭の値は返してくれません。

投稿日時 - 2005-04-25 17:59:57

お礼

迅速かつ複数回のご回答ありがとうございました。大変感謝してます。またの機会がありましたら、よろしくお願いします。

投稿日時 - 2005-04-26 10:09:29

INSERT tbl2(fld1)
SELECT (tbl1.fld1),
FROM tbl1 LEFT JOIN tbl2 ON tbl1.ID = tbl2.ID
WHERE (((tbl2.ID) Is Null));

ではどうでしょうか?

投稿日時 - 2005-04-25 12:48:10

補足

補足いたします。tbl2はtbl1に対するワークテーブルです。
『tbl1のレコードの中で、fld1が重複しないようにしてtbl2へレコードを移す。また重複のあるレコードについては、その重複する数をカウントしてfld3にセットし、fld2については最初に出てくるレコードの値をtbl2にセットする。』
ということを実現したいと思っています。
質問文がつたなく、わかりづらいと思いますが、よろしくお願いします。

投稿日時 - 2005-04-25 13:15:40

ANo.1

ODBCは当然知っていますよね?
http://e-words.jp/w/ODBC.html

投稿日時 - 2005-04-25 12:34:38

補足

補足させていただきます。ACCESSではGROUP BY句を使った場合に集計をかける関数が11種類ありますが、SQLServer上では5種類しかないように思われます。今回はその5種類にないFirst関数を使って集計をかけている場合についての質問です。
質問文が拙くご迷惑おかけしますが、よろしくお願いします。

投稿日時 - 2005-04-25 13:11:38

あなたにオススメの質問