DOBON.NET DOBON.NETプログラミング掲示板過去ログ

レコードの取得

  • 題名: レコードの取得
  • 著者: ぎょぴ
  • 日時: 2005/10/20 10:44:02
  • ID: 13348
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[windowsXP]
分類:[.NET]

はじめまして、VB.NETを初めて2ヶ月の初心者です。
レコードの最大値取得について教えて頂きたいのです。
--DagaBase:TEST--
FIELD1 FIELD2 FIELD3
1 TA A
1 TB A
1 TB B
1 TB C
------------------
と格納されているテーブルより
FIELD1=1,FIELD2=TBを取得した際に
FIELD3の最大値を獲得したいのです。
(この場合ですとCを取得)
No12796にて範囲までの取得は出来るのですが
それ以降が分かりません。
■No13348に返信(ぎょぴさんの記事)
> FIELD3の最大値を獲得したいのです。

Order Byで「Desc」を指定すれば良いのではないでしょうか。
こりんさん

> Order Byで「Desc」を指定すれば良いのではないでしょうか。

Descはクエリビルダの構文だったと思いますが、
クエリビルダにて使用で宜しいのでしょうか?
お世話になります。

最大値でしたら、SQL文はこんな感じでしょうか。
SELECT MAX(FIELD3) AS FIELD3_MAX_VALUE FROM TEST
WHERE FIELD1=1 AND FIELD2=TB

こちらが参考になると思います。
http://jeanne.wankuma.com/tips/sqlserver/03-executereader.html
(なおこ(・∀・)さん
お世話になります。
> 最大値でしたら、SQL文はこんな感じでしょうか。
> SELECT MAX(FIELD3) AS FIELD3_MAX_VALUE FROM TEST
> WHERE FIELD1=1 AND FIELD2=TB
より
"SELECT MAX(FIELD3) AS FIELD3_MAX_VALUE FROM TEST
WHERE FIELD1='"1"' AND FIELD2='"TB"'"と作成を行いましたが
TextBoxに出力するには
TextBox.Text = FIELD3_MAX_VALUE
としたのですが出力されませんでした。

再度ご教授お願い致します。

また説明不足でしたが違うレコード(1,TB,A)を開いている際に
1,TBでのFIELD3の最大値を取得との内容です。
お世話になります。

■No13357に返信(ぎょぴさんの記事)
ちょっと長文になりますが
データを画面に表示しつつ、最大値を取得したいのなら
こんな感じでしょうか。

# デザイナで画面にDataGrid1・ボタン・ラベルを1つずつ配置。
# VS2005 beta2でコーディングしたので若干違うところがあるかもしれませんがご容赦下さい。
==========================================================================
Public Class Form1
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    '画面の体裁を整える
    Me.Label1.Text = ""
    Me.Label1.BackColor = System.Drawing.Color.White
    Me.Label1.BorderStyle = BorderStyle.FixedSingle

    Me.Button1.Text = "最大値取得"
    Me.DataGrid1.DataSource = Nothing

    '全件表示する
    Me.DataGrid1.DataSource = Me.GetDataTable("SELECT FIELD1, FIELD2, FIELD3 FROM TEST")
    Me.DataGrid1.Refresh()

  End Sub

  '最大値取得ボタン押下時
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim dt As DataTable = Nothing

    Try
      dt = DirectCast(Me.DataGrid1.DataSource, DataTable)
      Dim rows() As DataRow = dt.Select("FIELD1='1' AND FIELD2='TB'", "FIELD3 DESC")
      If rows.Length > 0 Then
        'DESC で大きい順にソートしてあるので、1番目のレコードは一番でかいやつがとれる
        Dim row As DataRow = rows(0)
        Me.Label1.Text = DirectCast(row("FIELD3"), String)
      End If

    Catch ex As Exception
      MessageBox.Show(ex.Message())
    End Try
  End Sub

  'SQL文からDataTableに変換するメソッド
  Private Function GetDataTable(ByVal sqlScript As String) As DataTable

    'DBに接続し、データをDataGridにバインドする。
    Dim oleConnection As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection()
    Dim selectCommand As System.Data.OleDb.OleDbCommand
    Dim oleDataReader As System.Data.OleDb.OleDbDataReader

    Try
      oleConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb"
      oleConnection.Open()

      selectCommand = New System.Data.OleDb.OleDbCommand
      selectCommand.Connection = oleConnection
      selectCommand.CommandType = Data.CommandType.Text
      selectCommand.CommandText = sqlScript
      oleDataReader = selectCommand.ExecuteReader()

      Dim dt As DataTable = New DataTable(oleDataReader.GetSchemaTable.TableName)
      For i As Integer = 0 To oleDataReader.GetSchemaTable.Rows.Count - 1
        dt.Columns.Add(CType(oleDataReader.GetSchemaTable.Rows(i).Item("ColumnName"), String), _
               GetType(String))
      Next

      Do While oleDataReader.Read
        Dim row As DataRow = dt.NewRow()
        For i As Integer = 0 To oleDataReader.FieldCount - 1
          row(i) = Me.NullConvert(oleDataReader.Item(i))
        Next
        dt.Rows.Add(row)
      Loop
      Return dt

    Catch ex As Exception
      MessageBox.Show(ex.Message())
    Finally
      If Not oleConnection Is Nothing Then
        oleConnection.Close()
        oleConnection.Dispose()
      End If
    End Try

  End Function

  'DBNULLの値を0byteStringに変換するメソッド
  Private Function NullConvert(ByVal value As Object) As String
    If TypeOf value Is DBNull Then
      Return ""
    End If
    Return value.ToString()
  End Function
End Class
SQL Serverを使用しての作成であれば
ビューで最大値を取得したものを作成して
それを使用したらよいのでは?
ご連絡が遅れて申し訳ございません。

尾白様
SQL serverを使用していますが具体的にどの様にすれば宜しいのでしょうか?
■No13450に返信(ぎょぴさんの記事)

> --DagaBase:TEST--
> FIELD1 FIELD2 FIELD3
> 1 TA A
> 1 TB A
> 1 TB B
> 1 TB C
> ------------------
> と格納されているテーブルより
> FIELD1=1,FIELD2=TBを取得した際に
> FIELD3の最大値を獲得したいのです。

> また説明不足でしたが違うレコード(1,TB,A)を開いている際に
> 1,TBでのFIELD3の最大値を取得との内容です。

という書き込みより
FIELD1='1' かつ FIELD2='TB'のデータを表示しつつ
FIELD1='1' かつ FIELD2='TB'でFIELD3の最大値が欲しいって
読み取ったんですが、間違えてますでしょうか?

上記が間違えていないという前提での話になりますが、

GROUP BY句のROLLUPというモノを使うと
FIELD1='1' かつ FIELD2='TB'のデータと
FIELD1='1' かつ FIELD2='TB'でFIELD3の最大値
を1つのSQL文で取得することができます。

===================================================
----SQL文----
select * from
(
select FIELD1, FIELD2, FIELD3 ,max(FIELD3) FIELD3_MAX from TEST
WHERE FIELD1 = '1' and FIELD2 = 'TB'
group by FIELD1, FIELD2, FIELD3 WITH ROLLUP
) TEST2
where FIELD1 is not null and FIELD2 is not null
;
===================================================
----実行結果----
FIELD1 FIELD2 FIELD3 FIELD3_MAX
1 TB A A
1 TB B B
1 TB C C
1 TB NULL C
===================================================

実行結果の
1行目〜3行目まで(FIELD3がNULLでないもの)の
FIELD3_MAXはFIELD3と同値になるので、読み飛ばしてもらって
4行目(FIEDL3がNULLのもの)のFIELD3_MAXは
1行目〜3行目までのFIELD3で最大値の値が入ります。

この特性を生かして、
FIELD3の値がNULLでない場合は、表示したいデータとして扱い
FIELD3の値がNULLの場合は、合計値が取得されるデータとして扱えば
望みの結果が得られると思います。
すみません、書き忘れました。

上記SQLはSQLServer2000でやってます。
OracleだとROLLUPの構文がちと違います。。。

GROUP BY ROLLUP(FIELD1,FIELD2,FIELD3) となります。

またDBMSによってはROLLUPなどに対応していないかも・・・。
  • 題名: Re[10]: レコードの取得
  • 著者: ぎょぴ
  • 日時: 2005/10/26 13:29:20
  • ID: 13471
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
封真さん ご返答ありがとうございます。

早速実行を行ってみます

DOBON.NET | プログラミング道 | プログラミング掲示板