【问题标题】:Oracle Statement to fetch data and put results in columns用于获取数据并将结果放入列中的 Oracle 语句
【发布时间】:2022-08-18 17:32:59
【问题描述】:

我知道我的问题可能有点奇怪,但我以前没有使用过 Oracle, 我有这个语句来选择列中特定数字的计数并输出结果

select count(*)as Step1 from ALLVALUES WHERE NAME LIKE \'%VALUE%\' AND systime between caltosys(&t1) and caltosys(&t2) AND ROWNUM <= 90000 AND VALUE =\'48\'

这将输出这样的结果

------
Step1
------
20
------

例如,我需要获取多个条件并将每个结果放在列中

select count(*)as Step1 from ALLVALUES WHERE NAME LIKE \'%VALUE%\' AND systime between caltosys(&t1) and caltosys(&t2) AND ROWNUM <= 90000 AND VALUE =\'48\'
select count(*)as Step2 from ALLVALUES WHERE NAME LIKE \'%VALUE%\' AND systime between caltosys(&t1) and caltosys(&t2) AND ROWNUM <= 90000 AND VALUE =\'49\'
...

并输出如下

------------------------------
Step1 | Step2 | Step3 | Step4
------------------------------
20  | 5     | 1     | 4
------------------------------

在我目前的情况下这可能吗?

我试着写成建议的陈述

select to_char(systocal(systime),\'yyyy-mm-dd hh24:mi:ss.ff3\') as Time,
COUNT(case WHEN value =\'48.8\' then value end) as Step1,
COUNT(CASE WHEN value =\'48.75\' then value end) as Step2,
COUNT(CASE WHEN value =\'48.7\' then value end)as Step3,
COUNT(CASE WHEN value =\'48.68\' then value end)as Step4,
COUNT(CASE WHEN value =\'48.6\' then value end)as Step5,
COUNT(CASE WHEN value =\'48.58\' then value end)as Step6,
COUNT(CASE WHEN value =\'48.55\' then value end)as Step7,
COUNT(CASE WHEN value =\'48.52\' then value end)as Step8,
from MEA where ID = 5570 AND systime between caltosys(&t1) and caltosys(&t2) AND ROWNUM <= 100

&t1 - &t2 是时间变量

但是一直给我缺失的表情936

    标签: sql oracle


    【解决方案1】:

    您可以使用条件聚合,放宽 where 子句中的过滤器以包含您感兴趣的所有值,并使用 case 表达式仅计算匹配行:

    select
      count(case when value = '48' then value end) as Step1,
      count(case when value = '49' then value end) as Step2,
      count(case when value = '50' then value end) as Step3,
      count(case when value = '51' then value end) as Step4
    from ALLVALUES WHERE NAME LIKE '%VALUE%'
    AND systime between caltosys(&t1) and caltosys(&t2)
    AND ROWNUM <= 90000
    AND VALUE in ('48', '49', '50', '51')
    

    您也可以使用pivot 子句来实现相同的目的。

    虽然 rownum 过滤器看起来很奇怪 - 部分原因是数量很大,但主要是因为您将它应用于无序的结果集,因此结果将是不确定的(如果仍然有超过 90000 个匹配行)。

    【讨论】:

    • 我在这里的声明,但一直给我错误缺少表达式 936
    • @hawkiq - 你为 t1 和 t2 提供什么值,你的 caltosys 将什么数据类型作为参数并返回,systime 是什么数据类型? (这个works 具有固定值和虚拟函数,所以还有其他事情发生)。请添加信息作为问题的编辑 - 包括函数签名和示例数据/值。
    【解决方案2】:

    您可以使用PIVOT 将行重新组织为列。编写查询的一种方法(为简单起见省略时间列)是

    select * from
    (select value from MEA where ID = 5570)
    pivot
    (count(*) for value in 
      (
        '48.8' as Step1,
        '48.75' as Step2,
        '48.7' as Step3,
        '48.68' as Step4,
        '48.6' as Step5,
        '48.58' as Step6,
        '48.55' as Step7,
        '48.52' as Step8
      )
    );
    

    有关更多信息和示例,请参阅 Oracle 数据库数据仓库指南的 Pivoting Operations 章节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-06
      • 2021-07-09
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多