回答編集履歴
1
解説
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
|
+
クライアント側で整形処理をする方が効率はよいかもしれません
|