VBScript+SQLServerで特定レコードのグループ化された行数をカウントする方法

このQ&Aのポイント
  • 初めてASP+VBScript+SQLServerで開発をしており、MEMBERというテーブルから特定のレコードを抜き出し、ある項目でグループ化された行数を求めたいです。
  • 対象とするレコードのM_MSGIDを1とした場合、M_SEIDは5, 6, 8, 9の4種類なので、カウント結果は4になるようにしたいです。
  • 現在、カウントはしているが、条件によって正しくない結果が出てしまう問題があります。経験者が周囲におらず、情報を探しても解決策がわかりません。どうかお助けください。
回答を見る
  • ベストアンサー

VBScript+SQLServerでcountがうまくできない。

初めてASP+VBScript+SQLServerで開発をしています。 VB等の知識は皆無です。 【やりたいこと】 MEMBERというテーブルから特定レコード(M_MSGIDが一致したもの)を抜き出し、とある項目(M_SEID)でグルーピングした行数を求めたい。 【例・MEMBERがこんなだったら】 M_MSGID-M_SEID 1-5 1-5 1-6 1-8 1-9 1-9 2-10 対象とするM_MSGIDを1とした場合、M_SEIDは5,6,8,9の4種類なので、カウント結果4を求めたい。 【ソース】 SET SEID_rec=Server.CreateObject("ADODB.Recordset") SEID_rec.Open "SELECT cnt=count(*) from MEMBER where M_MSGID=" & MSGID & "group by M_SEID",DSN=xxx;UID=sa SECNT = SEID_rec("cnt") SEID_rec.Close 【問題点】 何やらカウントはしているようなのですが、条件によって正しかったり間違っていたりします。 周囲に経験者がおらず、WEBを探してもわかりませんでした。何卒よろしくお願いいたします。

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

  • ベストアンサー
  • kumagoro-
  • ベストアンサー率57% (36/63)
回答No.1

クエリ部分をこのようにしてみればどうでしょう? "SELECT cnt = COUNT(DISTINCT M_SEID) FROM MEMBER WHERE M_MSGID = " & MSGID

mogmogtae
質問者

お礼

出来ました! なんだか、「group by」ってのを勘違いしていた みたいです。 「Distinct」というので重複したM_SEIDを取り除くんですか。 ありがとうございました。

関連するQ&A

  • VBAでレコードセットの総レコード数を取得する方法

    Dim con As ADODB.Connection Dim rsData As ADODB.Recordset Dim DNSname$,USERname$,PASSw$,cnt&  Set con = CreateObject("ADODB.Connection")  con.Open "DSN=" & DNSname & "; UID= " USERname & "; PWD=" & PASSw  Set rsData = New ADODB.Recordset  rsData.Open SQL, con  Do While Not rsData.EOF   rsData.MoveLast   cnt=rsData.RecordCount   rsData.First  LOOP といいコードで総レコード数が取得できるかなとやってみたところ、rsData.MoveLastのところで、「行セットは逆フェッチをサポートしていません」というエラーが出ました。 なにかほかの方法で総レコード数を取得する方法があるのでしょうか? 自分で他に試したことは、rsData.EOFまでrsData.MoveNextでもっていきrsData.EOF-1レコードの.RecordCountを取得すしようと試みましたが、最後のレコードまできても.RecordCountは「-1」のまま変化しませんでした。レコードセットの呼び込み方が不味いのでしょうか?

  • ASP+IIS5.1+SQLServer

    動作環境OSはXP_pro、IIS5.1+ASPで、(.NETではありません)SqlServer2000のdbに接続してテーブルデータを表示していたスクリプトがあります。(システムDSN設定して) このたび、Sqlserverを2008に変えて、DBデータを2008にアタッチしてスクリプトを実行してみましたらエラーは表示されないものの、ブラウザ画面は真っ白で何も表示されません。 DBに接続できているようなのですが、データを表示することができません。 どこが原因なのでしょう? SSMSのログファイルの表示では、「Starting up database "●●"」となっておりエラーではない?ようです。 データを表示するという部分を、テーブルがEOFなら"EOF"、EOFでないなら"NOTEOF"をブラウザに表示するようなスクリプトにすると"NOTEOF"と画面に表示されます。 スクリプト内は、 cstrDSNNAME, cstrDSNUSER, cstrDSNPAWDは定数で、ユーザ名は'sa'です。 sqlserver2008のログインの'sa'に設定しているパスワードはcstrDSNPAWDと同じです。 Dim adoCon Dim adoRs '接続 -------------------------------------- Set adoCon = Server.CreateObject("ADODB.Connection") Set adoRsM = Server.CreateObject("ADODB.Recordset") adoCon.Open cstrDSNNAME, cstrDSNUSER, cstrDSNPAWD adoCon.CommandTimeout = 0 strSql="Select * from 商品M" adoRsM.Open strSql, adoCon, adOpenForwardOnly       (↓では”NOTEOF”と表示される) if adoRsM.EOF then "EOF"と表示される処理 else        "NOTEOF"と表示される処理 end if ↑を、テーブルデータを表示するような処理にするとブラウザ画面は真っ白で、エラーなどは表示されず、ブラウザの下のバーには「ページが表示されました」とでます。 何が原因かを調べるにはどうやったらいいでしょうか?? よろしくお願いいたします。

  • Microsoft ODBC For Oracle の設定方法

    Oracle9iです。 Oracle in OraHome92 のドライバで以下の方法でデータベースに接続していました。 Set ObjConn = Server.CreateObject("ADODB.Connection") ObjConn.open ("DSN=dsn;UID=uid;PWD=pwd") マイクロソフトから出ているドライバもあるということを知ったので、Microsoft ODBC For Oracleで接続するにはどうしたら良いか教えて下さい。 よろしくお願い致します。

  • WSHでVBScript使いDBのデータを削除、新規登録する。

    申し訳ありませんが、素人の質問です。 WSHをVBSCriptでDBのレコードを削除、 テキストファイルを呼びだし、 呼び出したデータを変数に格納し、DBにインサートしたいのですが、 DBへの接続の仕方がわかりません。 ASPで作成したものは正常に動作するのですが、 WSHで作成したものは、接続するさいにエラーしてしまいます。 エラー箇所は下記の部分です。 すみませんが、回答お願いします。 テキスト呼び出し箇所 Set fso = Server.CreateObject("Scripting.FileSystemObject") Set fts = fso.OpenTextFile("D:\**\*\*\*\A.dat", 1, False, 0) 接続箇所 Con_s.BeginTrans DELETE箇所 Set Rs = Server.CreateObject("ADODB.Recordset") Cmd_s.CommandText = delSq Rs.Open Cmd_s, , adOpenForwardOnly インサート箇所 Set Rs = Server.CreateObject("ADODB.Recordset") Cmd_s.CommandText = strSql Rs.Open Cmd_s, , adOpenForwardOnly 切断箇所 Con_s.CommitTrans

  • DB2のデーターベースに、ADOで接続して、レコードを取得していますが

    DB2のデーターベースに、ADOで接続して、レコードを取得していますが、同じ事をして、取得出来るときと、できないときがあります。 できない時は、objRec.EOF=true になり、処理が終了してしまいます。 誰が、この原因の探り方や、ヒントなどわかる人がいたら、教えていただけませんでしょうか。 以下、ソースの引用 Set objCon = WScript.CreateObject("ADODB.Connection") strCon="DSN=mans;UID=admin;PWD=pass" objCon.Open strCon Set objRec=CreateObject("ADODB.Recordset") objRec.Open strSQL, objCon, adOpenStatic If objRec.EOF Then Wscript.Echo "no data!" WScript.quit End If 後の処理に進む

  • SQLserverからのデータ取得

    はじめまして。カナと申します。 突然ASPで開発をすることになり、謎だらけで大変困っています。宜しくお願いいたします。 ・windowsXP ・Vbscript ・IIS5.0 質問:SQLserver2000からデータを取得し、そのテーブルの件数を表示する 以下のように記述したところ、ブラウザで確認すると「ページを表示できません 」になってしまいます。 ------- <%@ LANGUAGE="VBScript" %> <% option explicit %> <% Dim objCon ' DB接続コネクション Dim objRS ' DB結果レコードセット Dim sql ' SQL文 Dim errflg ' エラーフラグ 'DataSource名 Const DS = "111.111.0.1" ←IPアドレス。正しいものをいれてます Const IC = "DB名"      'ユーザ名 Const User = "sa" 'パスワード Const Pwd = "sa" Set objCon = Server.CreateObject("ADODB.Connection") Set objRS = Server.CreateObject("ADODB.Recordset") objCon.ConnectionString = "Provider=SQLOLEDB;" & _ "User ID=" & User & ";" & _ "Password=" & Pwd & ";" & _ "Data Source=" & DS & ";" & _ "Initial Catalog=" & IC objCon.Open sql = "select * from Aテーブル" objRS.Open sql,objCon,adOpenStatic,adLockReadOnly %> レコード件数 <%=objRS.RecordCount%> <% ' DBclose objCon.Close() Set objCon = Nothing objRS.Close() Set objRS = Nothing %> --------------- 以上です。どこかおかしいのでしょうか・・・。 VBAは触ったことがあるのですが、VBAのようにブレークポイントを付けるデバッグが出来ないので、どこで落ちたのかもわからず困っています。 こういう場合の、上手なデバッグ方法があれば、それもご教授いただきたいです。ちなみに客先なので、ソフトやツールのインストールなどは出来ません・・・。 前に進めず、本当に困っています。 どなたか、宜しくお願いいたします!

  • VBScriptでSQLに接続し、CSV出力したい

    お世話になります。 VBScriptでSQLに接続し、CSV出力したいのですが、どうしても上手くいかないのでどうかアドバイスを頂けたらと思います。 検索したサンプルを基に作成したプログラムです。 -------------------------------------- Dim ObjConn Dim objFso Dim objCsv Dim objRc Set ObjConn = Server.CreateObject("ADODB.Connection") ObjConn.Open "Provider=SQLOLEDB;Server=XXXXX;Database=XXXXX;UID=XXXXX;PWD=XXXXX" Set objFso = CreateObject("Scripting.FileSystemObject") Set objRc = Server.CreateObject("ADODB.Recordset") Set objCsv = objFso.CreateTextFile("C:\テスト.csv", True ) sql = "select * from `商品マスタ`" objRc.Open sql, ObjConn Dim i Dim Buffer Do While not objRc.EOF Buffer = "" For i = 0 to objRc.Fields.Count - 1 if Buffer <> "" then Buffer = Buffer & "," end if Buffer = Buffer & objRc.Fields(i).Value objCsv.WriteLine(Buffer) Next objRc.MoveNext Loop -------------------------------------- これを実行すると、無限ループのような状態になり、テスト.csvに延々改行のみが出力されます。(文字は何も出力されない) sql文の結果としては正しくは10レコードだけなので、For~Nextのループも10回しか繰り返さない筈なのですが、延々繰り返してしまっています。 objRc.RecordCount をやってレコード数を調べてみようともしましたが、結果としては何も返ってきません。 カーソルタイプによっては『-1』しか返らないとのことですが、-1すら返りません。 つまり、接続の時点で失敗していると思われるのですが、どこが間違っているのかが分かりません。 お詳しい方、ご教示いただけないでしょうか。 どうぞ、宜しくお願いいたします。

  • アクセスからのデータ読み込み

    初めて質問します。  現在ホームページで、アクセスDBからデータを読んで、 それに対して更新する処理を作ってますが、 どうもSQL文を発行するとエラーになってしまいます。  その処理自体は今まで動いてたのですが、サーバを新しいのにしたら動かなくなってしまいました。(-_-;) 以前この処理を作った人が消えてしまい、誰に聞いても 分かりません・・。  どこがいけないのか分からないので、皆さん助けて下さい!!m(__)m 一応ロジック書いときます。 ************************* Set Con1 = Server.CreateObject("ADODB.Connection") Con1.Open "****" Set CTemp = Server.CreateObject("ADODB.Command") Set Rec1 = Server.CreateObject("ADODB.Recordset") sSql="SQL文" CTemp.CommandText = sSql CTemp.CommandType = 1 Set cmdTemp.ActiveConnection = Con1 Rec1.Open CTemp, , 0, 1 *************************  エラーは、[Set cmdTemp.ActiveConnection = Con1] で起こります。 以下がエラーメッセージです。 ************************* 予期しないエラーです /mente/menu/A.asp 外部オブジェクトでトラップできるエラーが発生しました。スクリプトの実行を続行できません。 ************************* 誰か助けて下さい!!(T_T)

  • wshでcsvファイルのソートを行いたい

    wshのプログラムで困っているため教えてください。 wshでcsv(カンマ区切り)のファイルのソートを行い、Escel形式で保存するプログラムを書いています。 調べてみたところ、wshではソート関数がないようで、 adodbのsort関数を使用して対処しようとしていますが、どうもうまくいきません。 (※adodbの必要はないのですが、ExcelVBAのsortのコードを書こうとするとエラーになってしまったので、adodbにしています。) <仕様> csvファイルのソートのキーになるのは、「判定区分」の値で昇順に行いたいです。 csvファイルの一行目は、カラム名としてソート対象にはなりません。 読み込んだcsvファイルをexcel形式に保存したいです。 ■csvファイルの形式は、以下のような形です。 性別,年代,判定区分,生年月日,日付 女性,10,0,2010/01/10,2013/7/7 23:57 男性,50,2,2000/03/30,2013/7/7 13:7 女性,10,0,1990/01/20,2013/7/7 15:22 女性,20,1,2001/12/10,2013/7/7 8:10 *----------------------------------- <ソース> Set con = CreateObject("ADODB.Connection") With con .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path & ";" _ & "Extended Properties='text;HDR=Yes;FMT=Delimited'" .Open End With Set rec = CreateObject("ADODB.Recordset") rec.Open "select * from " & csvfile & " order by 判定区分", con *----------------------------------- うまくいかないため ↓でも書いています。 *----------------------------------- Const adDate = 7 Const adVarChar = 200 Dim ans Set objADO = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set re = CreateObject("VBScript.RegExp") rs.Fields.Append "性別", adVarChar, 255 rs.Fields.Append "年代", adVarChar, 255 rs.Fields.Append "判定区分", adVarChar, 255 rs.Fields.Append "生年月日", adDate rs.Fields.Append "日付", adDate rs.Open ans = "" rs.Sort ="判定区分 ASC" rs.MoveFirst Do While Not rs.EOF ans = ans & rs.Fields(0).Value & vbCrLf rs.MoveNext Loop MsgBox ans エラーになってしまいます。 ソート処理だけですでににっちもさっちもいかないため、教えていただきたいです。 どうぞ宜しくお願いいたします。

  • SQLServer2000でログインできません

    Windows2000SP4、IISの環境です。 1.SQLServer2000の認証:Windows認証を使用 2.ODBC接続時、 1)接続するサーバ名:Local 2)SQL ServerがログインIDの権限の確認を行う方法は    :ネットワークへのログインIDでWindows NTの認証メカニズムを使う 3.ASPファイルで以下のように記述しています。 Set Conn = Server.CreateObject(\"ADODB.Connection\") Conn.Open \"DSN=*****ODBCで登録した名前\" 4.エラーメッセージ: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]ユーザー \'*****(私のサーバ名)\' はログインできませんでした。 index.asp, line 22 5.その他 SQLクエリアナライザでは何も問題なく接続できます。 以上、説明が不十分かもしれません。 なぜログインできないか、ご存知の方教えてください。よろしくお願いします。

専門家に質問してみよう