回答

收藏

SQL-左联接分组依据

技术问答 技术问答 330 人阅读 | 0 人回复 | 2023-09-14

我有两张桌子。表A列出了员工姓名。表B是一个复杂的表,其中包含有关员工打来的电话的信息。: s; D+ A8 e+ }4 k
我的目标是制作一个包含“名称”和“
) u; O7 H2 ?6 T! VcallCount”列的表。我的目标是“左加入”和“分组依据”,但是我一直想念没有打过电话的员工。我怎样才能只保留名称并在其中放置零?
- C% ~1 W9 ]9 n5 r/ v% \也许我很亲密,有人可以指出我的错字吗?在此先感谢您的帮助,以下是SQL:" o, I: D" P8 ~3 E
SELECT A.name, COUNT(B.call_id) AS 'outgoing call count' * W8 Z! L* D( q8 ^$ g3 _. Y
FROM EmployeeTable A
+ l' w" D7 O# E  \2 K' X; JLEFT JOIN CallTable B : |. k6 F" D+ J4 G) e6 f' [. v
ON A.name = B.call_from_name
, k% M% _0 n1 `* n2 uWHERE B.call_type LIKE 'outgoing'
7 n+ i8 B) m$ Z, P1 A# K* w8 }( MAND B.voice_mail = '0' 2 t1 J! I5 X7 q% c2 e3 T1 k
...
; S1 \( p! m' Q: ?( TGROUP BY A.name
. U7 ^* b- v4 a# ]. I' u$ F               
! w7 ~% `% ]" Z$ j: T: \# Y4 L解决方案:
6 X; \8 W" [* [' X( d                8 \- C+ H% \+ k
# f# ~; i" F% K+ E

6 h$ h6 O% Q; ~+ v( y: u                这是一个JOIN而非NULL问题:您的过滤器正在将OUTER更改为INNER! ?5 R+ ~" A/ ?) J& R# r- U
JOIN。这意味着在CallTable(B)中有行的位置仅获得COUNT,而不是您想要的OUTER JOIN。% }8 Y. l" [5 p4 i7 C4 R1 X
SELECT A.name, COUNT(B.call_id) AS 'outgoing call count' ; y7 a$ k7 r" \7 q2 y% h
FROM% X) |; H2 a" H, q2 Q  T
   EmployeeTable A 5 C+ B" z3 F" \5 d
   LEFT JOIN
6 I1 E; X4 D: ?, L7 D1 X   (
( v" f* K% `0 P* ?" u   SELECT call_from_name, call_id FROM CallTable
7 j4 @8 Q; d8 _0 E0 P   WHERE call_type LIKE 'outgoing'
6 a% J; N# H$ u4 g! _     AND voice_mail = '0'' }% D8 V2 M2 k( p( V) H' ^
     AND /* other CallTable filters */" N0 `: h' ]7 ~1 K) o( K
   ) B' {4 P4 n8 K5 u0 H" B. G& m
   ON A.name = B.call_from_name( i; P' s5 }8 h( {
WHERE2 T5 g" m' C1 ^6 I. u+ E
     /* only EmployeeTable A filters */
! j% K8 {5 Q9 U( bGROUP BY A.name
* w" t% z5 G# u- }; M编辑:在其他地方发表评论后,您对B的所有过滤器都必须在派生表中,而不是在外部位置。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则