oracle 如何将SQL结果计数并分组到自定义组类别中?

kkbh8khc  于 2023-06-22  发布在  Oracle
关注(0)|答案(4)|浏览(149)

(先说声抱歉,我不是最好的作家!)
我在一家制造电子传感器的工厂工作。我们批量生产这些传感器-每批有10,000个传感器。到今天为止我们已经拍了3万件拍品。(3亿个传感器被处理)
我们对每个传感器进行测量,测量传感器的尾部弯曲的程度。如果尾部没有弯曲(并且与地板平行),则值为0。如果尾部以90度垂直向上弯曲到天花板,则值为1。如果尾部向下弯曲90度,则值为-1。
测量值通常不是整数,而是小数点后8位。例如0.18345171
这些值被写入Oracle数据库中名为SENSOR_INSPECTIONS的表。当表格按特定批号过滤时;它看起来像下面。

| SENSOR # | VALUE      |
| 1        | 0.33827491 |
| 2        | 0.41810703 |

有没有一种方法可以让我写一个SQL语句,在那里我执行一个计数,并根据我自己的自定义类别对值的数量进行分组?
对于这个例子,我想计数等于0的值的数量,大于0的值的数量,以及小于0的值的数量。
通常情况下,我会写一个像下面这样的SQL函数来做到这一点。但是由于有8个十进制位,这意味着至少可以有1亿个不同的值/类别!

SELECT VALUE, COUNT(VALUE) as TotalRepetitions
FROM SENSOR_INSPECTIONS
GROUP BY VALUE;

最后,我想要一个像下面这样的表:

| Value | TotalRepetitions |
| 0     | 12567            |
| >0    | 56795            |
| <0    | 23456            |
mf98qq94

mf98qq941#

您可以使用caseexpression 来获取不同的组:

SELECT VALUE_GROUP, COUNT(*) as TotalRepetitions
FROM
(
    SELECT CASE WHEN VALUE > 0 THEN '>0'
                WHEN VALUE < 0 THEN '<0'
                ELSE '0'
           END AS VALUE_GROUP
    FROM SENSOR_INSPECTIONS
)
GROUP BY VALUE_GROUP
ccgok5k5

ccgok5k52#

一个选项可以是条件聚合,例如

select 
  sum(case when value = 0 then 1 else 0 end) value_0,
  sum(case when value > 0 then 1 else 0 end) value_positive,
  sum(case when value < 0 then 1 else 0 end) value_negative
from sensor_inspections
new9mtju

new9mtju3#

您可以使用SIGN函数来确定值是正数、零还是负数:

SELECT SIGN(value) AS sign,
       COUNT(*) AS total_repetitions
FROM   table_name
GROUP BY SIGN(value)

其中,对于样本数据:

CREATE TABLE table_name (sensor#, value) AS
SELECT LEVEL, +1 - DBMS_RANDOM.VALUE(0, 1) FROM DUAL CONNECT BY LEVEL <= 25 UNION ALL
SELECT LEVEL, 0 FROM DUAL CONNECT BY LEVEL <= 20 UNION ALL
SELECT LEVEL, -1 + DBMS_RANDOM.VALUE(0, 1) FROM DUAL CONNECT BY LEVEL <= 23;

输出:
| 标牌|重复次数总计|
| - -----|- -----|
| 1|二十五|
| 0|二十个|
| -1|二十三|
如果你想用字符串来表示值,那么你可以用DECODE Package 它:

SELECT DECODE(SIGN(value), 1, '>0', -1, '<0', 0, '0') AS value,
       COUNT(*) AS total_repetitions
FROM   table_name
GROUP BY SIGN(value)

其输出:
| 价值|重复次数总计|
| - -----|- -----|
| >0|二十五|
| 0|二十个|
| <0|二十三|
fiddle

wixjitnu

wixjitnu4#

使用case语句将数据分组到类别中,然后根据您想要的方法选择SUMCOUNT
测试数据

CREATE TABLE test_data  (sensor_id, val) AS
(
  select 1, 0.1 from dual UNION ALL
  select 1, 0.12 from dual UNION ALL
  select 1, 0.198 from dual UNION ALL
  select 1, -0.2 from dual UNION ALL
  select 1, 0 from dual UNION ALL
  select 2, -1 from dual
  
);

每个类别使用一列

select sensor_id, 
       SUM(CASE WHEN val = 0 THEN 1 ELSE 0 END) as "0", 
       SUM(CASE WHEN val > 0 THEN 1 ELSE 0 END) ">0", 
       SUM(CASE WHEN val < 0 THEN 1 ELSE 0 END) "<0"
FROM test_data GROUP BY sensor_id;

 SENSOR_ID          0         >0         <0
---------- ---------- ---------- ----------
         1          1          3          1
         2          0          0          1

或按行分类

select sensor_id, 
       CASE WHEN val = 0 THEN '0' WHEN val <0 THEN '<0' ELSE '>0' END as my_category,
       COUNT(*)
FROM test_data GROUP BY sensor_id, CASE WHEN val = 0 THEN '0' WHEN val <0 THEN '<0' ELSE '>0' END;

 SENSOR_ID MY   COUNT(*)
---------- -- ----------
         1 <0          1
         1 0           1
         1 >0          3
         2 <0          1

相关问题