【问题标题】:How to Use Group By on the Basis of Column Value?如何根据列值使用 Group By?
【发布时间】:2020-09-18 17:01:51
【问题描述】:

我正在尝试使用 Group By 但无法实现输出 我想按日期、班次和质量分组。

数据如下:

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

【问题讨论】:

  • 您确定结果吗,我认为您需要计算每个日期、班次组的质量严格大于 3 和 10 的情况,不是吗?
  • 我想要一个日期的每个班次的结果,其中包含不同质量条件的计数。像 Mass>3 计数为 Shift A、B、C
  • 所以,作为一个例子;对于列质量>3(> 严格不是 >=),我们需要为 5 月 1 日的班次 B 获得 0,但不是 2。我错了吗?

标签: sql oracle group-by count pivot


【解决方案1】:

您可以使用Conditional AggregationGROUPing 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

Demo

【讨论】:

  • 我得到了我的结果,但我只需要解释一下,为什么我们使用 Sum,解释一下那一行,这样对我学习新事物会有帮助。
  • 因为,count 聚合会计算每个案例,而不会与您的条件 @ShahnawazAhmad 匹配。
【解决方案2】:
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> 

【讨论】:

  • 我可以使用解码而不是大小写吗?感谢您的解决方案。
  • 是的,见上面的解决方案。
  • @ShahnawazAhmad 。 . . case 更可取,因为它是标准 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2022-09-23
  • 2020-11-19
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多