GROUP BY B,A和GROUP BY COALESCE(B,A)之间的区别


20

我一直很困惑。

有人可以在什么情况下解释我要使用GROUP BY COALESCE吗?

我的猜测是,如果要按B列(如果B不为空)和A列按条件对一组数据进行条件分组,我将使用它。听起来对吗?

Answers:


37

随着GROUP BY b,a元组(null, 1)(1,1)(2,1)(17,1)会在四个不同的组结束了。

随着GROUP BY coalesce(b,a)元组(null,1)(1,1)(2,1)并且(17,1)将在同一个组。

如果要“条件”分组,那么可以,带有的版本coalesce可能就是您想要的。


克里斯·达特(Chris Date):“包含null的'type'不是类型(因为类型包含值)。包含null的'tuple'不是元组(因为tuple包含值)。
2011年

@onedaywhen:好吧,这就是理论与实践之间的区别;)
a_horse_with_no_name

我的观点:这就是关系中的元组与SQL表表达式中的行之间的区别。从理论上和实践上,元组都不适用于SQL。
2011年

@onedaywhen:所以您的意思是我应该更改措辞?您建议用哪个词来表示SQL中两个(列)值的组合?它们不一定需要来自同一张表,也不必是完整的行。
a_horse_with_no_name 2011年

1
例如,在教程D TUPLE { a 17 , b 1 }中与相同TUPLE { b 1 , a 17 },但在SQL中,行值构造函数(17, 1)与行值构造函数不同(1, 17)。这就是为什么您的“对”不是元组的原因。因为您已经省略了行类型构造函数,所以我必须从上下文中假设它们(a, b)不是,(b, a)但是包含它仍不能使它成为元组。相反,TUPLE { 17 , 1 }在教程D中不是有效的元组调用,也不是TUPLE { a null , b 1 }
2011年

16

这是a_horse_with_no_name出色的+1答案的演示。

SQL> WITH Data AS (
  2     SELECT level, DECODE(Level,3,NULL,1) A
  3        , DECODE(level,2,NULL,4,2,1) B
  4     FROM dual connect by level <=5
  5     )
  6  SELECT A, B, count(*) FROM Data GROUP BY B, A;

A B   COUNT(*)
- - ----------
1 1          2
1            1
1 2          1
  1          1


SQL> WITH Data AS (
  2     SELECT level, DECODE(Level,3,NULL,1) A
  3        , DECODE(level,2,NULL,4,2,1) B
  4     FROM dual connect by level <=5
  5     )
  6  SELECT COALESCE(B, A) X, count(*) FROM Data GROUP BY COALESCE(B, A);

X   COUNT(*)
- ----------
1          4
2          1

2
不错的示范!
a_horse_with_no_name 2011年

我必须反省思考“水平”,这非常有用!
Luc M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.