回答

收藏

将空值计为唯一值

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

我需要在列上计算不同的值,例如:+ 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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则