回答編集履歴

1

解説

2018/02/21 06:57

投稿

yambejp
yambejp

スコア114775

test CHANGED
@@ -43,3 +43,85 @@
43
43
  group by KEYCODE;
44
44
 
45
45
  ```
46
+
47
+
48
+
49
+ # 解説
50
+
51
+ 念のため簡単な解説だけつけておきます
52
+
53
+ 今回質問者さんがやろうとしていることはピボットテーブルといって
54
+
55
+ 縦軸のデータを横軸に表示しなおすことです。
56
+
57
+ 具体的なロジックはまずこういうこと
58
+
59
+ ```SQL
60
+
61
+ select KEYCODE
62
+
63
+ ,CASE CATEGORY WHEN 0 THEN CODE END AS CODE_A
64
+
65
+ ,CASE CATEGORY WHEN 1 THEN CODE END AS CODE_B
66
+
67
+ ,CASE CATEGORY WHEN 2 THEN CODE END AS CODE_C
68
+
69
+ ,NAME AS NAME
70
+
71
+ from tbl;
72
+
73
+ ```
74
+
75
+ 結果こうなります
76
+
77
+
78
+
79
+ |KEYCODE|CODE_A|CODE_B|CODE_C|NAME||
80
+
81
+ |:--|:--|:--|:--|:--|
82
+
83
+ |AA1000-01|AA1000-01|NULL|NULL|抵抗1|
84
+
85
+ |AA1000-01|NULL|BA1000-01|NULL|抵抗1|
86
+
87
+ |AA1000-01|NULL|NULL|CA1000-01|抵抗1|
88
+
89
+ |AA1001-01|NULL|BA1001-01|NULL|抵抗2|
90
+
91
+ |AA1002-01|NULL|NULL|CA1002-01|抵抗3|
92
+
93
+
94
+
95
+ これをKEYCODEをキーに縦方向にぐしゃっとつぶします
96
+
97
+ AA1000-01のCODE_Aは「AA1000-01,null,null」ですから
98
+
99
+ これをgroup_concatするとnullは無視されて(concat系の処理はnullを無視する)
100
+
101
+ 「AA1000-01」だけになるわけです。CODE_B、CODE_Cについても同様
102
+
103
+
104
+
105
+ 最後にNAMEについてEYCODEにたいしてNAMEは1対1なので
106
+
107
+ 本来はKEYCODEでgroup byすればNAMEは確定できるはずですが
108
+
109
+ SQLの文法上許されません。
110
+
111
+ そのままgroup_concatすると「抵抗1,抵抗1,抵抗1」となってしまいます
112
+
113
+ これを最初の定義1対1で決まる前提があるのでDISTINCTをすると
114
+
115
+ 複数の抵抗1がひとつにまとまるわけです
116
+
117
+
118
+
119
+ 本当は、KECODEとNAMEを別テーブルに正規化しておいて集計結果に
120
+
121
+ JOINするのが本来のSQLの処理です。
122
+
123
+
124
+
125
+ ピボットテーブルはデータ管理上の問題なのでデータ出力後
126
+
127
+ クライアント側で整形処理をする方が効率はよいかもしれません