DOBON.NETプログラミング道掲示板
(現在 過去ログ3 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33906 / inTopicNo.1)  縦横変換してのTableの合算
  
□投稿者/ だんご 一般人(7回)-(2018/07/06(Fri) 09:47:45)
  • アイコン環境/言語:[VB2017] 
    分類:[.NET] 

    既存のAccessのデータベース(XXX.accdb)の構造が、FNameTableとLNamaeTableが次のような構造であった場合に
    欲しいデータ形式でに変換する方法について教えてください。
    現在は、FNameTableとLNamaeTableをDataTableに取り込んで、コードで横縦変換後合算せています。(力技で)
    言語は、VisualBasic2017でDataTableを使用しています。

    何かいい方法ってありますか?詳しい方ご指導の程宜しくお願い致します。

    FNameTable
    ID | FName | Field
    01 | 岡田 | LNamae1
    02 | 山田 | LNamae2
    03 | 桜井 | LNamae3
    04 | 林田 | LNamae4
    05 | 栗林 | LNamae5

    LNamaeTable
    ID | LNamae1 | LNamae2 | LNamae3 | LNamae4 | LNamae5
    01 | 太郎 | 隆二 | 健一 | 武 | 広美


    欲しいデータ形式
    ID | FName | LName
    01 | 岡田 | 太郎
    02 | 山田 | 隆二
    03 | 桜井 | 健一
    04 | 林田 | 武
    05 | 栗林 | 広美

    追伸:データ構造自体が間違っているとの意見が多いと思いますが、既存のデータでこのような構造になっている
    ことは、それなりに意味があるものなので、別問題として扱ってください。

引用返信 削除キー/
■33908 / inTopicNo.2)  Re[1]: 縦横変換してのTableの合算
□投稿者/ 魔界の仮面弁士 大御所(1126回)-(2018/07/06(Fri) 12:22:11)
  • アイコン
    No33906に返信(だんごさんの記事)
    > LNamaeTable
    >  ID | LNamae1 | LNamae2 | LNamae3 | LNamae4 | LNamae5
    >  01 | 太郎    | 隆二    | 健一    | 武      | 広美
    
    これの ID 列の役割が分からなかったです。
    
    単一行のテーブルなのでしょうか?
    とりあえず単一行テーブルという前提で回答します。
    
    
    VB 側で LINQ 等で繋ぐ方法と、SQL 側で整形する方法が
    あるかと思いますが、とりあえず SQL で整形するとなると
    こういう形にならざるを得ないかな…。
    
    SELECT
      [FNameTable].[ID] AS [ID]
    , [FNameTable].[FName] AS [FName]
    , IIF([FNameTable].[Field] = 'LNamae1', [LNamaeTable].[LNamae1],
      IIF([FNameTable].[Field] = 'LNamae2', [LNamaeTable].[LNamae2],
      IIF([FNameTable].[Field] = 'LNamae3', [LNamaeTable].[LNamae3],
      IIF([FNameTable].[Field] = 'LNamae4', [LNamaeTable].[LNamae4],
      IIF([FNameTable].[Field] = 'LNamae5', [LNamaeTable].[LNamae5],
      NULL))))) AS [LName]
    FROM
      [FNameTable], [LNamaeTable]
    ORDER BY
      [FNameTable].[ID]

引用返信 削除キー/
■33909 / inTopicNo.3)  Re[2]: 縦横変換してのTableの合算
□投稿者/ だんご 一般人(8回)-(2018/07/06(Fri) 13:43:10)
  • アイコンLNamaeTableは、単一行の場合と複数行の場合があります。
    今使っている力技のコードは、次のようなものです。
    Function Transpose(SouceDt As DataTable) As DataTable
    Dim ReturnDt As New DataTable
    'Rowsの数だけColumnを追加する
    For Each Column As DataRow In SouceDt.Rows
    ReturnDt.Columns.Add("Column" + SouceDt.Rows.IndexOf(Column).ToString)
    Next
    '単純にループで入れ替える
    For ColumnsCount As Integer = 0 To SouceDt.Columns.Count - 1
    ReturnDt.Rows.Add(ReturnDt.NewRow)
    For RowsCount As Integer = 0 To SouceDt.Rows.Count - 1
    ReturnDt.Rows(ColumnsCount).Item(RowsCount) = SouceDt.Rows(RowsCount).Item(ColumnsCount)
    Next
    Next
    Return ReturnDt
    End Function

    LNameのフィールド名もケースによって異なるので、クエリーでは難しそうですね?
    ExcelのTRANSPOSE 関数みたいなものをイメージしていませた。

引用返信 削除キー/
■33910 / inTopicNo.4)  Re[3]: 縦横変換してのTableの合算
□投稿者/ 魔界の仮面弁士 大御所(1127回)-(2018/07/10(Tue) 17:31:45)
  • アイコンNo33909に返信(だんごさんの記事)
    > LNamaeTableは、単一行の場合と複数行の場合があります。

    複数テーブル間のマッピングだと、しばしば Dictionary が使われたりしますね。

    ただ、LNamaeTable が複数行だった場合、FNameTable との間で
    どのようにマッピングされるのか読み取れませんでした。

    ID 列に繋がりも無さそうですし、他に連携できそうな情報が無いような…。


    > ExcelのTRANSPOSE 関数みたいなものをイメージしていませた。

    DataTable に対するそのものズバリは無いので、現状の作りのままで良いのでは無いでしょうか。
    あるいは DataTable に対して、Transpose という名の拡張メソッドを設けるのも良いかもしれませんね。


    > LNameのフィールド名もケースによって異なるので、クエリーでは難しそうですね?

    今回は元データを再加工できないそうですし、
    それぞれのケースに応じたクエリーを動的に作るか、
    それぞれのケースに応じて VB 側で再構築するか、でしょう。

    具体的なルールが分かれば、ループ処理なり LINQ 也で汎用的に変換できるかもしれませんが、どちらにしても自前で実装することになるでしょうね。

    行列変換と言うと、TRANSFORM という SQL 構文が用意されていますが、これは値を列名に変換するものなので、LNamaeTable を縦並びにするのには使えないですし…。
    https://msdn.microsoft.com/ja-jp/library/office/ff192901.aspx



    > Function Transpose(SouceDt As DataTable) As DataTable
    souce より
    source の方が良いかも。

    あとは、RowState の扱いをどうするのか…。
    (特に Deleted な行が含まれていた場合)


    >   ReturnDt.Columns.Add("Column" + SouceDt.Rows.IndexOf(Column).ToString)

    For Each して .Rows.IndexOf で番号を得るよりも、
    For ループを使った方が手っ取り早い気がします。

     For r = 0 To SouceDt.Rows.Count - 1
      ReturnDt.Columns.Add("Column" & CStr(r))
     Next
引用返信 削除キー/
■33911 / inTopicNo.5)  Re[4]: 縦横変換してのTableの合算
□投稿者/ だんご 一般人(9回)-(2018/07/11(Wed) 17:13:39)
  • アイコン提供している情報が、限定的ですみません。
    ご指摘を受けるたびに、それに対してはこのような条件があります。的な!イワユル後出しジャンケン的な質問方法になり大変申し訳なく思っています。

    ご指導頂いた内容についてよく、考えてスキルアップにつなげていきたいと思います。

    いつも、ご丁寧に本当にありがとうございます。
    また、ネットに接続できず、お礼が遅くなりすみませんでした。



解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -