回答

收藏

将空值计为唯一值

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

我需要在列上计算不同的值,例如:6 B/ R7 T: n& H8 c: A3 V
Hours
$ a. `* w* n9 j* t: ~# N12 ~$ J5 v1 B5 n0 K
11 F- h* F5 K9 u" I+ X: f, h
2' i; {  `2 X2 m8 T$ B: L$ y# a+ u
null& M! E$ w) Q+ ]6 i! z5 I- q/ a
null' L/ J9 Y( U( Z, |
null
; A* r: g5 G5 |" X结果必须是: 3 。我的查询是:
" {  w+ R" q  \9 dselect count(distinct hour) from hours;
' e; j" R/ h) ^3 A但它返回:2.我还测试了:
$ x7 B. {, n. k9 o/ vselect count(*) from hours group by hour
- X$ _# o# y6 V% ]& Z% K7 U# G, ^但它返回三行:% U3 S* R# u* {1 [1 l5 G
(1) 3
  J& S. n8 {. l5 Q  |; |" l(2) 2
9 e: M0 z# M0 {: W+ T: l5 V3 B(3) 1
3 G0 R- ~) L! A# n3 v5 I* I8 ~我怎样才能将空值算作1值,并使用distinct来避免对重复值进行计数?) Q+ T: ^2 f8 P" y
我正在学习高级SQL,他们希望我对所有解决方案有以下要求:! j. i8 R7 ]- ]# M2 i, s. N  X

) U9 v  O* ?, j! }. b' S尝试最小化解决查询所需的子查询数。此外,不允许使用以下构造:
0 r* u/ I5 D- _1 i3 Y& U在FROM或SELECT中选择。允许您有子查询(在WHERE或HAVING中进行SELECT)
+ k" N' z& D* Y( L聚合函数的组合,例如COUNT(COUNT …)),SUM(COUNT …))等。; \3 \1 c' m3 N$ a2 ~
如果可以避免,请使用UNION。
/ q, Q9 j3 I. O# b5 U非标准功能(例如NVL)
, F9 |0 L; g: B' O2 w案子
8 ?6 M+ W. f3 v7 F% m
# R4 {$ A. w4 D; a+ w* T
/ x- A- H4 `; s& a, Y5 ]) V  _
/ Q! a. W! E" e1 d
               
  @4 ]$ V: {% \6 m解决方案:
0 l' S* m) ]7 F                1 A- G' |# R4 E7 n; Q
, ]( b. L' E! p, R8 O" X: z

0 R  ~, f, v  `                select  count(distinct col1) + count(distinct case when col1 is null then 1 end)# M4 _, }# d" F8 q; _
from    YourTable
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则