如何根据列值使用分组依据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据列值使用分组依据?相关的知识,希望对你有一定的参考价值。
我正在尝试使用分组依据,但无法实现输出我想按日期,班次和质量分组。
数据就像:
date | shift | mass
---------+-------+------
01-05-20 | A | 5
01-05-20 | B | 3
01-05-20 | B | 3
02-05-20 | A | 11
02-05-20 | A | 5
02-05-20 | C | 12
02-05-20 | C | 12
02-05-20 | B | 5
我想要的输出
date | shift | mass>3 | mass>10
---------+-------+--------+--------
01-05-20 | A | 1 | 0
01-05-20 | B | 2 | 0
02-05-20 | A | 1 | 1
02-05-20 | B | 1 | 0
02-05-20 | C | 0 | 2
答案
您可以通过Conditional Aggregation
到GROUP
使用BY mydate,shift
:
SELECT mydate,shift,
SUM(CASE WHEN mass > 3 THEN 1 ELSE 0 END) AS "mass>3",
SUM(CASE WHEN mass >10 THEN 1 ELSE 0 END) AS "mass>10"
FROM t
GROUP BY mydate,shift
ORDER BY mydate,shift;
顺便说一句(您在评论中要求它),也可以使用DECODE()
函数:
SELECT mydate,shift,
SUM(DECODE(SIGN(mass-3),1,1,0)) AS "mass>3",
SUM(DECODE(SIGN(mass-10),1,1,0)) AS "mass>10"
FROM t
GROUP BY mydate,shift
ORDER BY mydate,shift
另一答案
SQL> with t(mydate, shift, mass) as
2 (
3 select '01-05-2020', 'A', 5 from dual union all
4 select '01-05-2020', 'B', 3 from dual union all
5 select '01-05-2020', 'B', 3 from dual union all
6 select '02-05-2020', 'A', 11 from dual union all
7 select '02-05-2020', 'A', 5 from dual union all
8 select '02-05-2020', 'C', 12 from dual union all
9 select '02-05-2020', 'C', 12 from dual union all
10 select '02-05-2020', 'B', 5 from dual
11 )
12 SELECT mydate,shift,
13 SUM(CASE WHEN mass >=3 AND
14 mass < 10 THEN 1 ELSE 0 END) AS "mass>=3",
15 SUM(CASE WHEN mass >10 THEN 1 ELSE 0 END) AS "mass>10"
16 FROM t
17 GROUP BY mydate,shift
18 ORDER BY mydate,shift;
MYDATE S mass>=3 mass>10
---------- - ---------- ----------
01-05-2020 A 1 0
01-05-2020 B 2 0
02-05-2020 A 1 1
02-05-2020 B 1 0
02-05-2020 C 0 2
SQL>
SQL>
以上是关于如何根据列值使用分组依据?的主要内容,如果未能解决你的问题,请参考以下文章