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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

4回答

937閲覧

縦データから横データ表示について

pon108

総合スコア19

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/10/23 01:47

前提・実現したいこと

いつもお世話になっております。
VisualStudioのWinフォームにて
DataGridViewに縦に並んでいるデータからある列の内容を取り出し
その列の縦データを列ヘッダーにしたいと考えており、
出来ればSQLのみで対応したいと思います。
求める表示の列は可変となっており、最大30列まであります。

<元データ>
社員ID|プロジェクト名|
----------
001 | A |
002 | A |
003 | A |
001 | B |
002 | B |
003 | C |

<求める表示>
A| B| C|・・・
-------
001|001|003
002|002|
003|

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

列数が可変となっているので
動的に列を作成する必要があると思うのですが
すでにあるデータ分(重複なし)をどのようにして動的作成していくか
分かりません。

試したこと

下記サイトなどをみて考えてみましたがまだまだ初心者のため内容が掴みきれていません。
参考サイト_1
参考サイト_2

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

VisualStudio2017
SQLServer2016
開発言語 VB

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pon108

2019/10/26 07:46

回答ありがとうございます。 返信が遅くなってしまい、申し訳ございません。 提示頂きましたサイトを拝見させていただきましたが、思っているような表示方法は出来ませんでした。 サイトのように纏めた一覧を縦に表示したいと考えております。 他に何かいい方法はないものでしょうか。
Orlofsky

2019/10/26 10:27

質問に実際に実行したSQLと実行結果を追記しては? テーブル定義はCREATE TABLEに修正して欲しいです。
guest

0

VB 側でやるのはどうでしょう?

VB

1Option Strict On 2 3Module Module1 4 5 Sub Main() 6 ' データ作成 7 Dim dt1 As New DataTable 8 dt1.Columns.Add("社員ID") 9 dt1.Columns.Add("プロジェクト名") 10 dt1.Rows.Add("001", "A") 11 dt1.Rows.Add("002", "A") 12 dt1.Rows.Add("003", "A") 13 dt1.Rows.Add("001", "B") 14 dt1.Rows.Add("002", "B") 15 dt1.Rows.Add("003", "C") 16 17 ' 並び替え 18 Dim dt2 As New DataTable 19 Dim dic As New Dictionary(Of String, Integer) 20 For Each dr As DataRow In dt1.Rows 21 Dim shainId As String = dr("社員ID").ToString() 22 Dim projectName As String = dr("プロジェクト名").ToString() 23 Dim nRow As Integer = 0 24 If Not dic.TryGetValue(projectName, nRow) Then 25 dic.Add(projectName, nRow) 26 dt2.Columns.Add(projectName) 27 Else 28 nRow += 1 29 dic(projectName) = nRow 30 End If 31 Dim currentRow As DataRow 32 If nRow >= dt2.Rows.Count Then 33 currentRow = dt2.NewRow 34 dt2.Rows.Add(currentRow) 35 Else 36 currentRow = dt2.Rows(nRow) 37 End If 38 currentRow(projectName) = shainId 39 Next 40 41 ' 結果表示 42 Console.WriteLine(String.Join(",", dic.Keys.ToArray())) 43 For Each dr As DataRow In dt2.Rows 44 Console.WriteLine(String.Join(",", dr.ItemArray())) 45 Next 46 Console.ReadKey() 47 dt1.Dispose() 48 dt2.Dispose() 49 End Sub 50 51End Module

投稿2019/10/30 14:22

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実行していませんが、下記でできると思います。

SELECT CASE WHEN プロジェクト名 = A THEN 社員ID END AS A,
CASE WHEN プロジェクト名 = B THEN 社員ID END AS B,
CASE WHEN プロジェクト名 = C THEN 社員ID END AS C
FROM 元データ
;

投稿2019/10/29 15:07

kodenkoden

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pon108

2019/10/31 21:35

回答ありがとうございます。 列名としたいプロジェクト名が増えていくので、まずはプロジェクト名を重複無しで取得し、取得結果分上記コードでループさせて列を作成するという事でよかったでしょうか? この場合のループをどのようにすればよいのか思い浮かばず、躓いています。。。
guest

0

縦を横にするなら普通はこうでは?

SQL

1create table tbl (id int,name varchar(10)); 2insert into tbl values 3(1,'A'), 4(2,'A'), 5(3,'A'), 6(1,'B'), 7(2,'B'), 8(3,'C'); 9 10 11select id 12,sum(case name when 'A' then 1 else 0 end) as A 13,sum(case name when 'B' then 1 else 0 end) as B 14,sum(case name when 'C' then 1 else 0 end) as C 15from tbl 16group by id;
  • 結果
idABC
1110
2110
3101

投稿2019/10/23 02:03

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pon108

2019/10/26 07:51

回答ありがとうございます。 また返信が遅くなってしまい、申し訳ありません。 横を縦という表現は語弊があるかもしれません。 回答いただきましたコードでは思ってる表示が出来ず困っております。 そもそも考えが間違っていたり、出来ないものなのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問