QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

データテーブルのグループ化

vs2005(vb) win xp winform

いつも拝見させていただいております。

ひとつ質問があります。

データテーブルのグループ化はできるのでしょうか!?

現状、SQLで抽出したデータに、加工を加えたデータテーブルがあります。
(日付,名前コード,金額)

この場合に、日付でグループ化をし、名前コードが100以上のもので、sum(金額)としたものを抽出し、他のデータテーブルにいれるということは可能でしょうか?

今は、テーブルをループさせて、同じ名前コードのとき地道に金額を足していき、名前コードが100以上のものは、スルーさせるという方法でおこなっているのですが、もし、違う方法がございましたら、ご教授願いたいと思いまして、書き込みしました。

もし、違う方法でグループ化を実装させているかたがおりましたら、ご教授お願いいたします。

質問者:*

回答

まずはSQLのGROUP BYを調べてみてはどうですか?
_________________--------------------------------------------
*HIRO's.NET **PowerShell,VB.NET,C#のTipsを掲載しています
*
HIRO's.NET Blog **PowerShell,VB.NET,C#を中心とした技術ネ

投稿者:HIRO

編集 履歴 (0)

for文とif文でいいよ

投稿者:ぷさいくろう

編集 履歴 (0)

HIROさん、ぷさいくろうさん返答ありがとうございます。

HIROさん
まずはSQLのGROUP BYを調べてみてはどうですか?

SQLで抽出時にGROUP BYするということでしょうか?
それとも、加工を加えたデータテーブルに、GROUP BYすることができるのでしょうか?
現状、SQLでDataSetに抽出したデータに、加工を加えたデータテーブルを使用しています。

ぷさいくろうさん
for文とif文でいいよ

良い方法が無いようならこれでいこうと思います。

投稿者:*

編集 履歴 (0)

DataTable 自体には行を グループ化 する機能は無いので、
自前で実装することになると思います。

こんな HOW TO がありました。
HOW TO: Implement a DataSet GROUP BY Helper Class in Visual C# .NET
http://support.microsoft.com/kb/326145/EN-US/
_________________かるあ のメモ と スニペット

投稿者:かるあ

編集 履歴 (0)

申し訳ありません。
勘違いしていたようです。

*さんの引用
---------------------------------------------------------------------
現状、SQLで抽出したデータに、加工を加えたデータテーブルがあります。
(日付,名前コード,金額)
---------------------------------------------------------------------
SQL抽出後にグループ化したいということだったのですね...(汗)

SQLでGROUP BYしたものをData Tableにセットしたらよいのでは?と勘違いしてました。
失礼しました。
_________________--------------------------------------------
*HIRO's.NET **PowerShell,VB.NET,C#のTipsを掲載しています
*
HIRO's.NET Blog **PowerShell,VB.NET,C#を中心とした技術ネ

投稿者:HIRO

編集 履歴 (0)

ここの会議室も微妙な部屋分けですね

SQLの実行時にできるならgropu byなり分析関数なりを使う
.netでやりたいならfor文とif文を組み合わせる

普通はSQLでやりますけどね

投稿者:ぷさいくろう

編集 履歴 (0)

こんにちは。

NAL-6295 さんと同じように Expression プロパティで設定したものを View
で条件付けてあげればなんとか…と思っていましたが、View に条件をつけても
Expression を設定した列の内容は変わらないのですな代替案として、無理やりですがこんな感じを。

とりあえずこんな感じにテーブル(仮に dataTable としておきます)に列を追加
して




dataTable.Columns.Add("合計条件", typeof(int));
dataTable.Columns["合計条件"].Expression = "IIF([名前コード]>=100, [金額], 0)";
dataTable.Columns.Add("金額合計", typeof(int));
dataTable.Columns["金額合計"].Expression = "SUM([合計条件])";

合計条件の Expression プロパティを書き換えてやれば、あとは金額合計列
の内容を取得するだけで何とかできそうな気がします。
グループ化…は難しそうなので、その辺だけは for ループで日付も条件に入れてあげないといけないかな。

とりあえずこんな感じでいかがでしょうか。
_________________ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

投稿者:ぽぴ王子

編集 履歴 (0)

みなさん返答ありがとうございます。

かるあさん
こんな HOW TO がありました。

HOW TO: Implement a DataSet GROUP BY Helper Class in Visual C# .NET

http://support.microsoft.com/kb/326145/EN-US/

今後のことも考えて、上記のページを参考に実装したらうまくいきました。

NAL-6295さん、ぽぴ王子さん
Expression プロパティ…
こんな方法があるなんて知らなかったです。
グループ化しなくてもいい所はこれでいこうと思います。

大変参考になりました。ありがとうございました。

投稿者:*

編集 履歴 (0)

ぽぴ王子さんの書き込み (2006-10-10 11:12) より:

こんにちは。

NAL-6295 さんと同じように Expression プロパティで設定したものを View

で条件付けてあげればなんとか…と思っていましたが、View に条件をつけても

Expression を設定した列の内容は変わらないのですな
代替案として、無理やりですがこんな感じを。

とりあえずこんな感じにテーブル(仮に dataTable としておきます)に列を追加

して




dataTable.Columns.Add("合計条件", typeof(int));
dataTable.Columns["合計条件"].Expression = "IIF([名前コード]>=100, [金額], 0)";
dataTable.Columns.Add("金額合計", typeof(int));
dataTable.Columns["金額合計"].Expression = "SUM([合計条件])";

合計条件の Expression プロパティを書き換えてやれば、あとは金額合計列

の内容を取得するだけで何とかできそうな気がします。

グループ化…は難しそうなので、その辺だけは for ループで
日付も条件に入れてあげないといけないかな。

とりあえずこんな感じでいかがでしょうか。

グループキーに相当する項目を持った親DataTableを作成して
対象となる子DataTableとDataRelationを利用して連結することで、
グループキーによる集計も可能です。
ただ親DataTableにも存在するグループキー分のデータが必要に
なるし、結構めんどくさいです。
ただ、そういう事もできると言うことで、実際にexpression列を
使った事はありません。

以下、できるよーというサンプルコード



        Dim 子テーブル As New DataTable
        子テーブル.Columns.Add(New DataColumn("番号"))
        子テーブル.Columns.Add(New DataColumn("枝番"))
        子テーブル.Columns.Add(New DataColumn("数量", GetType(Decimal)))

        For 番号 As Integer = 1 To 10
            For 枝番 As Integer = 1 To 10
                Dim 新規行 As DataRow = 子テーブル.NewRow()
                新規行("番号") = 番号
                新規行("枝番") = 枝番
                新規行("数量") = 番号 * 100 + 枝番
                子テーブル.Rows.Add(新規行)
            Next
        Next


        Dim 親テーブル As New DataTable
        親テーブル.Columns.Add(New DataColumn("番号"))
        親テーブル.Columns.Add(New DataColumn("数量計", GetType(Decimal)))
        For 番号 As Integer = 1 To 10
            Dim 新規行 As DataRow = 親テーブル.NewRow()
            新規行("番号") = 番号
            親テーブル.Rows.Add(新規行)
        Next

        Dim ds As New DataSet
        ds.Tables.Add(子テーブル)
        ds.Tables.Add(親テーブル)

        Dim 番号でグループ化するためのリレーション As New DataRelation("サンプル", 親テーブル.Columns("番号"), 子テーブル.Columns("番号"))

        親テーブル.ChildRelations.Add(番号でグループ化するためのリレーション)
        親テーブル.Columns("数量計").Expression = "SUM(Child.数量)"

        For Each 現在行 As DataRow In 親テーブル.Rows
            Console.WriteLine(String.Format("番号:{0} 数量計:{1}", 現在行("番号"), 現在行("数量計")))
        Next


投稿者:NAL-6295

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。