teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

文言の修正

2020/11/04 14:05

投稿

maru-omochi
maru-omochi

スコア11

title CHANGED
File without changes
body CHANGED
@@ -3,9 +3,18 @@
3
3
 
4
4
  ■人情報が入っているテーブルからその人名と、その人が休暇を取得した場合に、
5
5
  休暇情報が入ったテーブルから休暇行使日を取得した休暇別に取得したいです。
6
+ 加えて、上詰めで表示で来てたら尚うれしいです。
7
+ 最悪上詰めで無くてもよいです。
6
8
 
9
+ 【発生している問題点】
10
+ ・本来は入っていない重複したデータが取得されてしまいます。
11
+ 実際に取得されたイメージを下に掲載いたしました。
7
12
 
13
+
14
+ 【テーブルの構成】
15
+ 「person」
16
+
8
- ・人情報が入っているテーブル=「PERSON」のカラムはそれぞれ、
17
+ ・人情報が入っているテーブル=「person」のカラムはそれぞれ、
9
18
  person_id int primary key
10
19
  person_code varchar2(10) not null
11
20
  person_name varchar2(50) not null
@@ -20,7 +29,9 @@
20
29
 
21
30
  とします。
22
31
 
32
+ 「holiday」
33
+
23
- ・休暇の取得情報が入っているテーブル=「HOLIDAY」のカラムはそれぞれ、
34
+ ・休暇の取得情報が入っているテーブル=「holiday」のカラムはそれぞれ、
24
35
  holiday_id int primary key
25
36
  person_code varchar2(10) not null
26
37
  holiday_code varchar2(4) not null
@@ -66,7 +77,7 @@
66
77
  |C|null|null|2020/10/04|
67
78
  |C|null|null|2020/10/05|
68
79
 
69
- 太字の個所のように、実際結合する前のテーブルで A の 有休 は1日しかかったはずなのに、二つに増えてしまいました
80
+ 太字の個所のように、本来はない重複データが取得されてしまいま
70
81
  原因もさっぱりわからず、これを実現するためにどのようにネットでサーチしたらよいかもさっぱりでして、
71
82
  また助けていただけるとありがたいです。
72
83
 
@@ -128,8 +139,6 @@
128
139
  のように実際にないデータ、または休暇を取っている人がおらずにデータがない場合等、データを取得できない場合に結合できない為か、
129
140
  その列だけすべてnullになればよいものが、データがぐちゃぐちゃになって集計されてしまいます。
130
141
 
131
- 前回同様文章が拙いものとなってしまい、伝わりづらいかもしれませんが、お分かりになられる方何卒よろしくお願い申し上げます。
132
-
133
142
  データが問題が起きている現場のものと一緒でない為、もしかするとここに書いた情報だけでは特定できないということもあるかもしれませんが、可能性だけでもご教授いただけたら大変ありがたいです。
134
143
 
135
144
  尚前回ご指摘いただいた修正依頼でデータをインサートする部分も記述せよとのことだったのですが、

2

とりいそぎデータの修正

2020/11/04 14:05

投稿

maru-omochi
maru-omochi

スコア11

title CHANGED
File without changes
body CHANGED
@@ -1,22 +1,10 @@
1
1
  ### 前提・実現したいこと
2
2
   お疲れ様です。
3
- 前回こちらにて質問させていただいたものです。
4
- https://teratail.com/questions/301870
5
3
 
6
- 前回回答していただいて一旦解決したのです、テーブルに入っているタによってうまく集計できない(希望通りになない)
4
+ ■人情報が入っているブルかその人名と、その人が休暇を取得した場合に、
7
- 場面出てくること気が付きました。
5
+ 休暇情報入ったテーブルから休暇行使日を取得した休暇別取得したいです
8
6
 
9
- どういう現象が起こるかというと、実際のテーブルにないデータが抽出されてきます。
10
7
 
11
- まず前回の内容と重複する部分もあるのですが、初めてこちらから見ていただいている方もいらっしゃると思うので
12
- ある程度再掲させてください。
13
-
14
- 長文になりますことを先にお詫びいたします。
15
-
16
- 【実現したいこと】
17
-  
18
- ■人情報が入っているテーブルからその人名と、その人が休暇を取得した場合に、
19
- 休暇情報が入ったテーブルから休暇行使日を取得した休暇別に取得したいです。
20
8
  ・人情報が入っているテーブル=「PERSON」のカラムはそれぞれ、
21
9
  person_id int primary key
22
10
  person_code varchar2(10) not null
@@ -31,6 +19,7 @@
31
19
 
32
20
 
33
21
  とします。
22
+
34
23
  ・休暇の取得情報が入っているテーブル=「HOLIDAY」のカラムはそれぞれ、
35
24
  holiday_id int primary key
36
25
  person_code varchar2(10) not null
@@ -38,45 +27,30 @@
38
27
  holiday_name varchar2(30) not null
39
28
  used_date char(10 char)
40
29
  で、
41
- 前回は入っているデータを仮に、
42
- |holiday_id|person_code|holiday_code|holiday_name|used_date|
43
- |:--:|:--:|:--:|:--:|
44
- |1|001|1000|代休|2020/10/01|
45
- |1|001|2000|有給|2020/10/02|
46
- |1|001|1000|代休|2020/10/03|
47
- |2|002|2000|有給|2020/10/04|
48
- |2|002|1000|代休|2020/10/05|
49
- |3|003|3000|怪我病欠|2020/10/06|
50
- |3|003|3000|怪我病欠|2020/10/07|
51
- |3|003|3000|怪我病欠|2020/10/08|
52
30
 
53
- とさせていただいたのですが、今回問題が発生したデータが以下、
31
+ 今回問題が発生したデータが以下、
54
32
  |holiday_id|person_code|holiday_code|holiday_name|used_date|
55
33
  |:--:|:--:|:--:|:--:|
56
34
  |1|001|1000|代休|2020/10/01|
57
- |**1**|**001**|**1000**|**代休**|**2020/10/02**|
35
+ |1|001|1000|代休|2020/10/02|
58
- |1|001|2000|有給|2020/10/02|
36
+ |1|001|2000|有給|2020/10/03|
59
- |1|001|1000|代休|2020/10/03|
37
+ |1|001|1000|怪我病欠|2020/10/04|
60
- |2|002|2000|有給|2020/10/04|
38
+ |2|002|2000|有給|2020/10/01|
39
+ |2|002|1000|代休|2020/10/03|
61
40
  |2|002|1000|代休|2020/10/05|
62
- |3|003|3000|怪我病欠|2020/10/06|
41
+ |3|003|3000|怪我病欠|2020/10/03|
63
- |3|003|3000|怪我病欠|2020/10/07|
42
+ |3|003|3000|怪我病欠|2020/10/04|
64
- |3|003|3000|怪我病欠|2020/10/08|
43
+ |3|003|3000|怪我病欠|2020/10/05|
65
44
 
66
- 上から二番目の行が追加になった場合に先ほどの重複問題が発生いたしました。
67
- ※ただし実際に起きたデータとは中身が異なることを先にお伝えいたします。
68
- データ数があまりに多いことと、現場のデータなのでこちらに書くわけにもいかずでして、、、
69
- 一旦前提条件の話を続けます。
45
+ とします。
70
46
 
71
47
  これら二つのテーブルを、取得したい休暇情報分自己結合したのち、以下のようなイメージでデータを取得したいと考えております。
72
48
  |person_name|代休|有休|怪我病欠|
73
49
  |:--:|:--:|:--:|:--:|
74
- |A|2020/10/01|2020/10/02|null|
50
+ |A|2020/10/01|2020/10/03|2020/10/04|
75
51
  |A|2020/10/02|null|null|
76
- |A|null|null|null|
77
- |A|2020/10/03|null|null|
52
+ |B|2020/10/03|2020/10/01|null|
78
- |B|null|2020/10/04|null|
79
- |B|2020/10/05|null|null|
53
+ |B|2020/10/04|null|null|
80
54
  |C|null|null|2020/10/06|
81
55
  |C|null|null|2020/10/07|
82
56
  |C|null|null|2020/10/08|
@@ -84,15 +58,13 @@
84
58
  しかし実際に出てきたデータがこちら
85
59
  |person_name|代休|有休|怪我病欠|
86
60
  |:--:|:--:|:--:|:--:|
61
+ |A|2020/10/01|2020/10/03|2020/10/04|
62
+ |A|2020/10/02|**2020/10/03**|**2020/10/04**|
87
- |A|2020/10/01|2020/10/02|null|
63
+ |B|2020/10/03|2020/10/01|null|
88
- |A|2020/10/02|**2020/10/02**|null|
64
+ |B|2020/10/04|**2020/10/01**|null|
89
- |A|null|null|null|
90
- |A|2020/10/03|null|null|
91
- |B|null|2020/10/04|null|
92
- |B|2020/10/05|null|null|
93
- |C|null|null|2020/10/06|
65
+ |C|null|null|2020/10/03|
94
- |C|null|null|2020/10/07|
66
+ |C|null|null|2020/10/04|
95
- |C|null|null|2020/10/08|
67
+ |C|null|null|2020/10/05|
96
68
 
97
69
  太字の個所のように、実際結合する前のテーブルでは A の 有休 は1日しかなかったはずなのに、二つに増えてしまいました。
98
70
  原因もさっぱりわからず、これを実現するためにどのようにネットでサーチしたらよいかもさっぱりでして、

1

コードの部分がトリプルバッククォートで挟まれていなかったので修正しました。

2020/11/04 13:57

投稿

maru-omochi
maru-omochi

スコア11

title CHANGED
File without changes
body CHANGED
@@ -100,6 +100,7 @@
100
100
 
101
101
  ### 試したこと
102
102
  前回の質問の時に教えていただいた、下のクエリで集計いたしました。
103
+ ```
103
104
  SELECT p.person_name
104
105
  , h1.used_date 代休, h2.used_date 有給, h3.used_date 怪我病欠
105
106
  FROM PERSON p
@@ -112,7 +113,7 @@
112
113
  left JOIN HOLIDAY h3
113
114
  ON h3.holiday_code='3000'
114
115
  and p.person_code = h3.person_code
115
-
116
+ ```
116
117
  その時に、クロス集計することになるだろうとはおっしゃっていただいたのですが、
117
118
  調べた際に出てきたクロス集計では
118
119
  「SELECT p.person_name