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

回答編集履歴

5

NULLエスケープ漏れ分

2016/09/28 14:28

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -106,16 +106,19 @@
106
106
 
107
107
  次はメインクエリの方のサンプルを記載します。
108
108
  (上記クエリを選択クエリ「Query1」にしたと想定)
109
+
110
+ ※サブクエリ側のカラムは常にNULLが混入する可能性があるので、
111
+ 今回のケースでは全てエスケープしといた方が無難ですね。
109
112
  ```SQL
110
113
  SELECT
111
114
  LocalGov.LgName
112
- , Nz(JF1, 0) AS JT1
115
+ , Nz(JF1, 0) AS JT1
113
- , JP1
116
+ , Nz(JP1, 0) AS JP1
114
- , JH1
117
+ , Nz(JH1, 0) AS JH1
115
- , DATA_CNT - AF AS ZCount
118
+ , Nz(DATA_CNT, 0) - Nz(AF, 0) AS ZCount
116
- , AF AS ADCount
119
+ , Nz(AF, 0) AS ADCount
117
- , S1
120
+ , Nz(S1, 0) AS S1
118
- , SP1
121
+ , Nz(SP1, 0) AS SP1
119
122
  FROM
120
123
  LocalGov
121
124
  LEFT JOIN Query1

4

カラム名修正

2016/09/28 14:27

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -135,4 +135,4 @@
135
135
 
136
136
  ちなみに蛇足ですが、
137
137
  JT1などの他のカラムで軒並み0を返しているのは、
138
- ZFが1を返すのと同じ理屈で**iif内の条件が成立していない(falseになる)**からではないでしょうかね?
138
+ ZCountが1を返すのと同じ理屈で**iif内の条件が成立していない(falseになる)**からではないでしょうかね?

3

蛇足

2016/09/27 17:24

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -131,4 +131,8 @@
131
131
  ```
132
132
 
133
133
  Accessで動作検証できる環境にないので、
134
- このやり方でも駄目でしたらすみません・・・
134
+ このやり方でも駄目でしたらすみません・・・
135
+
136
+ ちなみに蛇足ですが、
137
+ JT1などの他のカラムで軒並み0を返しているのは、
138
+ ZFが1を返すのと同じ理屈で**iif内の条件が成立していない(falseになる)**からではないでしょうかね?

2

コード追記

2016/09/27 17:23

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -10,7 +10,125 @@
10
10
  またそもそも対象行が存在しない場合は、
11
11
  いくらSUM内で0エスケープかけても意味がないため、
12
12
  下記のように**SUMした結果をエスケープ**するとうまくいくのではないでしょうか?
13
+ **(※LEFT JOINにてレコードなしでも全てNULLの行が発生するため、`SUM(Nz([カラム名], 0))`と動作差異は出なさそうです、すみません)**
14
+ ```SQL
15
+ Nz(SUM([カラム名]),0) --SUMした結果に対してNz関数を適用
16
+ ```
13
17
 
18
+ #追記
19
+ コメントに記載しましたが、
20
+ LEFT JOIN内のサブクエリで集約を行う方法だとうまく数が取れそうな気がします。
21
+ 先ず確認のため、以下が現状のSQLとなっております。
22
+ (インデントは勝手につけました)
14
23
  ```SQL
24
+ SELECT
25
+ LocalGov.LgName
26
+ , sum(JF1) AS JT1
27
+ , sum(JF2) AS JT2
28
+ , sum(JF3) AS JT3
29
+ , max(J1) AS JP1
30
+ , max(J2) AS JP2
31
+ , max(J3) AS JP3
32
+ , sum(J1) AS JH1
33
+ , sum(J2) AS JH2
34
+ , sum(J3) AS JH3
35
+ , sum(ZF) AS ZCount
36
+ , sum(AF) AS ADCount
37
+ , sum(Sk_zai) AS S1
38
+ , max(Sk_zai) AS SP1
39
+ , sum(Sk_ad) AS S2
40
+ , max(Sk_ad) AS SP2
41
+ , sum(Tk_zai) AS SK1
42
+ , max(Tk_zai) AS SKP1
43
+ , sum(Tk_ad) AS SK2
44
+ , max(Tk_ad) AS SKP2
45
+ , sum(Hikasan) AS HK
46
+ , max(Hikasan) AS HKP
47
+ , sum(Kikasan) AS KK
48
+ , max(Kikasan) AS KKP
49
+ FROM
50
+ LocalGov
51
+ LEFT JOIN (
52
+ SELECT
53
+ LgName
15
- Nz(SUM([カラム名]),0) --SUMした結果に対してNz関数を適用
54
+ , iif(Jtype = 1, 1, 0) AS JF1
55
+ , iif(Jtype = 2, 1, 0) AS JF2
56
+ , iif(Jtype = 3, 1, 0) AS JF3
57
+ , iif(Jtype = 1, Jimu, 0) AS J1
58
+ , iif(Jtype = 2, Jimu, 0) AS J2
59
+ , iif(Jtype = 3, Jimu, 0) AS J3
60
+ , iif(isnull(Date_ad), 1, 0) AS ZF
61
+ , iif(isnull(Date_ad), 0, 1) AS AF
62
+ , Sk_zai
63
+ , Sk_ad
64
+ , Tk_zai
65
+ , Tk_ad
66
+ , Hikasan
67
+ , Kikasan
68
+ FROM
69
+ WT_SQ_G1
70
+ ) AS T1
71
+ ON LocalGov.LgName = T1.LgName
72
+ WHERE
73
+ LgMember = TRUE
74
+ GROUP BY
75
+ LocalGov.LgName
76
+ , LgMemberSeq
77
+ ORDER BY
78
+ LgMemberSeq;
16
- ```
79
+ ```
80
+
81
+ 上記を改めて見たところ、
82
+ 集約しているカラムは全て**WT_SQ_G1テーブル**から取得していそうですので、
83
+ LEFT JOINでくっつける前にWT_SQ_G1のみで集約をかけると良いと思います。
84
+
85
+ 以下はそのサンプルとなります。
86
+ 先ずは手始めにLEFT JOINの内部から・・・
87
+ **(※一部省略していますのでご注意を・・・)**
88
+ ```SQL
89
+ -- LEFT JOIN内のクエリ
90
+ -- サブクエリ内でごちゃごちゃし過ぎると、
91
+ -- Accessのレポート機能でエラーになることがあるらしいので選択クエリで用意する等工夫する必要があるかも・・・
92
+ SELECT
93
+ LgName
94
+ , COUNT(*) AS DATA_CNT
95
+ , SUM(iif(Jtype = 1, 1, 0)) AS JF1
96
+ , MAX(iif(Jtype = 1, Jimu, 0)) AS JP1
97
+ , SUM(iif(Jtype = 1, Jimu, 0)) AS JH1
98
+ , COUNT(Date_ad) AS AF
99
+ , SUM(Sk_zai) AS S1
100
+ , MAX(Sk_zai) AS SP1
101
+ FROM
102
+ WT_SQ_G1
103
+ GROUP BY
104
+ LgName
105
+ ```
106
+
107
+ 次はメインクエリの方のサンプルを記載します。
108
+ (上記クエリを選択クエリ「Query1」にしたと想定)
109
+ ```SQL
110
+ SELECT
111
+ LocalGov.LgName
112
+ , Nz(JF1, 0) AS JT1
113
+ , JP1
114
+ , JH1
115
+ , DATA_CNT - AF AS ZCount
116
+ , AF AS ADCount
117
+ , S1
118
+ , SP1
119
+ FROM
120
+ LocalGov
121
+ LEFT JOIN Query1
122
+ ON LocalGov.LgName = Query1.LgName
123
+ WHERE
124
+ LgMember = TRUE
125
+ -- 以下のGROUP BYはサブクエリで事前集約するよう変更したため不要
126
+ -- GROUP BY
127
+ -- LocalGov.LgName
128
+ -- , LgMemberSeq
129
+ ORDER BY
130
+ LgMemberSeq;
131
+ ```
132
+
133
+ Accessで動作検証できる環境にないので、
134
+ このやり方でも駄目でしたらすみません・・・

1

誤字修正

2016/09/27 17:17

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -7,8 +7,9 @@
7
7
  ```
8
8
  のせいだと思われます。
9
9
 
10
+ またそもそも対象行が存在しない場合は、
10
- またそもそも対象行がが存在しな場合はいくらSUM内で0エスケープかけも意味がないので
11
+ いくらSUM内で0エスケープかけも意味がないため
11
- 下記のよう**SUMした結果をエスケープ**したらうまくいくのではないてましょうか?
12
+ 下記のよう**SUMした結果をエスケープ**するとうまくいくのではないしょうか?
12
13
 
13
14
  ```SQL
14
15
  Nz(SUM([カラム名]),0) --SUMした結果に対してNz関数を適用