質問: ### 前提・実現したいこと 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に表示させるのですが その際日付を横並びにして下記表のように月の最後まで表示させたいです。 ![![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/50e5295d5366819ef4bc4fe4e506f534.png)](5ee270b3d021b12b3146956cc15f62b2.png) ### 発生している問題・エラーメッセージ 縦に持っているデータの横表示をどのようにすればよいか分からず、 また月により列数が変化するのでその場合どのように書けば分かりません。 ### 試したこと [リンク内容]( https://dev.classmethod.jp/etc/sql-data-horizontal-vertical/) 上記サイトを頼りに考えてみましたが日付で横並びにする方法がどうしても考えつきません。 ### 補足情報(FW/ツールのバージョンなど) ・VisualStudio2017 ・SQLServer2016 ・開発言語...VB
回答: ``` 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( 生産台数 ) FOR 日 IN ([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 ``` このような感じで