質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

datagridview表示 縦型データを横表示

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 641

pon108

score 17

前提・実現したいこと

VisualStudio2017を使用し、月間生産計画が見れるWindowsアプリケーションを作成しております。
表示方法としてdatagridviewを使用して日々の計画が見れるようにしたいと考えております。

表示させるデータはSQLServer2016に保存しており
テーブル内容が下記のようになります。

■keikakuテーブル

・日付   date
・製品名  nvarchar(50)
・現場   nvarchar(50)
・勤務帯  nvarchar(50)
・生産台数 int

日付 | 製品名 | 現場 | 勤務帯 | 生産台数
ーーーーーーーーーーーーーーーーーーーーーーー
2019-05-01| A | イ支部 | 一次 | 900
2019-05-01| A | イ支部 | 二次 | 900
2019-05-01| A | イ支部 | 三次 | 900
2019-05-01| B | ロ支部 | 一次 | 900
2019-05-01| B | ロ支部 | 二次 | 900
2019-05-01| B | ロ支部 | 三次 | 900
2019-05-01| C | ハ支部 | 一次 | 900
2019-05-01| C | ハ支部 | 二次 | 900
2019-05-01| C | ハ支部 | 三次 | 900
2019-05-01| C | 二支部 | 一次 | 900
2019-05-01| C | 二支部 | 二次 | 900
2019-05-01| C | ニ支部 | 三次 | 900


このテーブル内容をdatagridviewに表示させるのですが
その際日付を横並びにして下記表のように月の最後まで表示させたいです。
![イメージ説明](5ee270b3d021b12b3146956cc15f62b2.png)

発生している問題・エラーメッセージ

縦に持っているデータの横表示をどのようにすればよいか分からず、
また月により列数が変化するのでその場合どのように書けば分かりません。

試したこと

リンク内容

上記サイトを頼りに考えてみましたが日付で横並びにする方法がどうしても考えつきません。

補足情報(FW/ツールのバージョンなど)

・VisualStudio2017
・SQLServer2016
・開発言語…VB 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/05/06 08:55

    pivot をキーワードに調べてみてはいかがでしょう? ただ、pivot で望む結果が得られたとしても、DataGridView に画像のような形で標示するのは無理っぽいので、そのあたりを先に考えた方が良いかもしれません。

    キャンセル

  • pon108

    2019/05/06 09:10

    回答ありがとうございます。

    PIVOTを調べてみました。
    構文を確認したところ列数を指定しないと使用できないみたいなのですが
    何か方法が他にあるのでしょうか?
    参考にしたサイトは下記になります。
    https://www.casleyconsulting.co.jp/blog/engineer/162/

    また表示は
    https://www.atmarkit.co.jp/fdotnet/dotnettips/593dgvgroupedcell/dgvgroupedcell.html
    こちらを参考にしようと考えております。

    キャンセル

  • SurferOnWww

    2019/05/06 09:34

    知っていること (今回の場合は参考にしてるサイト) は最初の質問に書くようお願いします。

    キャンセル

回答 1

checkベストアンサー

0

select
     tmp.製品名
    ,tmp.現場
    ,tmp.勤務帯
    ,sum(case DAY(tmp.日付) when 1 then tmp.生産台数 else null end) as [1日]
    ,sum(case DAY(tmp.日付) when 2 then tmp.生産台数 else null end) as [2日]
    ,sum(case DAY(tmp.日付) when 3 then tmp.生産台数 else null end) as [3日]
    ,sum(case DAY(tmp.日付) when 4 then tmp.生産台数 else null end) as [4日]
    ,sum(case DAY(tmp.日付) when 5 then tmp.生産台数 else null end) as [5日]
    from
    (
        select 日付 , 製品名 , 現場 ,  勤務帯 , 生産台数 from keikaku
    ) tmp
group by
    tmp.製品名 , tmp.現場 , tmp.勤務帯


もしくは

select 製品名 , 現場 ,  勤務帯 ,[1] ,[2] ,[3] ,[4] ,[5] 
    from 
        (select DAY(日付) AS 日 , 製品名 , 現場 ,  勤務帯 , 生産台数 from keikaku) tmp
        PIVOT ( SUM( 生産台数 ) FORIN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10]
                                          ,[11],[12],[13],[14],[15],[16],[17],[18],[19],[20]
                                          ,[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]
                                          )) AS p
ORDER BY 製品名 , 現場 ,  勤務帯


このようなSQLで日を横とした結果が得られるかと思います。
ただ、現状のテーブルでは「一次、二次、三次」となりませんので注意してください。
詳しくは「漢数字 ソート」などで検索すればよろしいかと

また、その月の日の増減に関しては、VB側でSQLを構築する形にして必要日分の列とすればよろしいかと思います。

For i = 1 to その月の最終日
   SQL &= $",max(case DAY(tmp.日付) when {i} then tmp.生産台数 else null end) as [{StrConv(i.ToString, VbStrConv.Wide)}日]"
Next


もしくは

SQL = "select 製品名 , 現場 ,  勤務帯"
For i = 1 to その月の最終日
   SQL &= $",[{i}]"
Next


このような感じで

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/06 21:39

    回答ありがとうございます。

    提示していただきましたコードを参考にさせていただき
    思い通りの表示が出来ました。

    丁寧に教えていただき本当に助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る