我需要在列上计算不同的值,例如:+ o" J8 X0 m) j2 B" X' D
Hours6 _% |& @8 k# @- b/ m s
1 ' E$ z) O ], }0 j5 D7 W1& y; x1 F2 \* P- y+ N5 }: W
26 L8 a7 \ m6 Q1 F" l% b. n
null1 M& s+ `1 j( b8 W
null- d% o( N% H' c1 _3 q' H. a, Z
null4 `" s+ N# ]2 M8 u# l, @% b
结果必须是: 3 。我的查询是: 8 w- |4 a) f9 q' O2 S) Fselect count(distinct hour) from hours; : v c2 m( b7 n( O/ g1 X9 f/ L D但它返回:2.我还测试了: 5 b. c, T g3 h9 ?' \select count(*) from hours group by hour 9 H! u1 k& Y- b" b0 [+ G0 p, o但它返回三行: ) A# @( r) D9 w: P# a( s4 @1 {(1) 3 ( D: P- s- C( R5 a2 s! V(2) 2 " L# M+ a& B! I+ T* E4 q h# J(3) 1+ C6 z' K, e. v7 ]) }, @
我怎样才能将空值算作1值,并使用distinct来避免对重复值进行计数? * R- O- _7 S; X我正在学习高级SQL,他们希望我对所有解决方案有以下要求:7 \: Z$ @9 A' m# } % g( o' H# z; e( r
尝试最小化解决查询所需的子查询数。此外,不允许使用以下构造: # n/ I) @ O3 G2 a# u0 B/ \在FROM或SELECT中选择。允许您有子查询(在WHERE或HAVING中进行SELECT) 1 C: N% w0 x6 k聚合函数的组合,例如COUNT(COUNT …)),SUM(COUNT …))等。% ^+ V! K! Q( z; d# L/ A
如果可以避免,请使用UNION。 ; v2 {$ `* w6 [( A: k5 Q" B; v2 k非标准功能(例如NVL) 9 b0 |, |# v, k% C* [ _! N7 p* X" N案子0 e" T4 E/ Q( C. u+ ~
9 }6 c7 @* d, A ' W% l0 w0 q( y x3 J, u 6 ?3 H& `7 j+ Y4 N w! H + ~" K2 `9 s7 G. i! u4 c 解决方案: # T- m7 U% e& [' }, Q ( M& p$ x; r( v. S" n- k
' b. ^+ w' P+ M4 q1 v+ a h8 x / D6 u0 a6 I0 w) l C$ { select count(distinct col1) + count(distinct case when col1 is null then 1 end) x+ e5 ]9 X$ Jfrom YourTable