小编ajm*_*d04的帖子

具有多列的oracle汇总函数

我有一个简单的查询:

WITH data(val1, val2, val3) AS
     ( SELECT 'a' ,'a-details' ,'1' FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by rollup(val1, val2);
Run Code Online (Sandbox Code Playgroud)

我得到一个输出:

VAL1                             VAL2                                    TOT
-------------------------------- -------------------------------- ----------
a                                a-details                                 1 
a                                                                          1 
b                                b-details                                 2 
b                                                                          2 
c                                c-details                                 3 
c                                                                          3 
Total Result                                                               6 
Run Code Online (Sandbox Code Playgroud)

但我需要一个输出,如:

VAL1                             VAL2                                    TOT
-------------------------------- -------------------------------- ----------
a                                a-details                                 1 
b                                b-details                                 2 …
Run Code Online (Sandbox Code Playgroud)

sql oracle rollup

8
推荐指数
2
解决办法
2万
查看次数

Oracle case里面的where子句

这是一个简单的问题,我已经阅读了有关使用CASEin WHERE子句的一些细节,但无法清楚地了解如何使用它.以下是我的示例查询:

1    SELECT * FROM dual
2    WHERE (1 =1)
3     AND (SYSDATE+1 > SYSDATE)
4     AND (30 > 40)
5     AND (25 < 35);
Run Code Online (Sandbox Code Playgroud)

我有i_value参数中的程序.如果i_value为'S',我需要忽略第4行,如果i_value为'T',我需要忽略第5行.

提前致谢.

sql oracle plsql case where

6
推荐指数
1
解决办法
3万
查看次数

Oracle PLSQL将日期时间截断为15分钟

我想将我的数据汇总到15分钟段(一小时的季度).为此,我编写了一些生成15分钟日期时间块的代码.

SELECT 
   TRUNC(SYSDATE,'hh') + 0.25/24 - (ROWNUM) *0.25/ 24
   AS time_start,
   ROWNUM,
   TRUNC(SYSDATE,'hh') + 0.25/24 - (ROWNUM - 1) *0.25/ 24
   AS time_end
FROM widsys.consist 
WHERE ROWNUM <3000
ORDER BY sysdate
Run Code Online (Sandbox Code Playgroud)

我的代码的问题是因为它使用了一个小时截断,它只会从最近一小时的开始生成时间戳.例如,11:49AM现在生成的第一个戳是11:00AM.

我需要它从最后15分钟的块开始生成标记(11:45AM从上面的例子).谁能帮帮我吗?

sql oracle datetime plsql truncate

6
推荐指数
1
解决办法
8016
查看次数

Oracle中的字符串顺序分组

我的任务是对给定字符串中的相似数字/字符进行分组,例如:字符串的SQL输出4455599应该是44 555 99并且正在使用以下查询:

with t(str)
as (
  select '4455599' from dual
)
select listagg(str_grouped ,' ') within group (order by rownum) str_split
from(
    select listagg ( str) within group ( order by lvl) str_grouped
    from(
        select level lvl, 
               substr(str,level,1) str, 
               dense_rank() over( order by substr(str,level,1)) drank_no
        from t
          connect by level <= length(str)
    )
 group by drank_no
  );
Run Code Online (Sandbox Code Playgroud)

但是查询失败了,因为我正在使用以下数据dense_rank.

445559944,期待44 555 99 44但得到4444 555 99.

bb119911,期待bb 11 …

regex sql oracle oracle11g

6
推荐指数
1
解决办法
107
查看次数

从表中的对值中获取计数

count_temp表

将上面作为样本表的输出,我需要一个sql查询,结果"2"作为表中的计数.

我已经尝试了最初的4列发送,并且没关系; 但是更多的行显示不正确的o/p.给出了我的旧代码

SELECT COUNT(*)/2
     FROM 
     (SELECT sentby,sentto
     FROM
          (SELECT DISTINCT sentby, sentto FROM count_temp)
     WHERE sentto IN
          (SELECT DISTINCT sentby FROM count_temp )
      AND sentby IN
          (SELECT DISTINCT sentto FROM count_temp )
     ) ;
Run Code Online (Sandbox Code Playgroud)

在此先感谢:)并赞赏.

sql oracle oracle11g

5
推荐指数
1
解决办法
114
查看次数

为什么COUNT(DISTINCT fieldA)比COUNT慢(DISTINCT LTRIM(RTRIM(UPPER(fieldA))))?

我是SQL Server 2005中执行计划的新手,但这让我感到困惑.

当我运行此代码时......

((SELECT COUNT(DISTINCT StudentID)
 FROM vwStudentUnitSchedules AS v
 WHERE v.UnitActive = 1
   AND v.UnitOutcomeCode IS NULL
   AND v.UnitCode = su.UnitCode
   AND v.StartDate = su.StartDate
   AND v.StudentCampus = st.StudentCampus) - 1) AS ClassSize
Run Code Online (Sandbox Code Playgroud)

为了获得班级规模,它会超时并且一般地运行它,它需要30秒

但是当我用这个微小的修改来运行它时......

 ((SELECT COUNT(DISTINCT LTRIM(RTRIM(UPPER(StudentID))))
     FROM vwStudentUnitSchedules AS v
     WHERE v.UnitActive = 1
       AND v.UnitOutcomeCode IS NULL
       AND v.UnitCode = su.UnitCode
       AND v.StartDate = su.StartDate
       AND v.StudentCampus = st.StudentCampus) - 1) AS ClassSize
Run Code Online (Sandbox Code Playgroud)

它几乎立即运行.

是因为LTRIM()RTRIM()和UPPER()函数?他们为什么要让事情变得更快?我想这是因为COUNT(DISTINCT是一个按字符从左到右计算的聚合?是StudentID是VARCHAR(10).

谢谢

sql performance sql-server-2005

5
推荐指数
1
解决办法
289
查看次数

oracle dbms_scheduler repeat_interval

我在打包的MY_PACKAGE_X中有一个名为MY_PROCEDURE_X的过程.我的要求是程序需要在每个月的1号和16号执行.如果它在本月的第1天运行,则执行时间应为10:00 AM,如果它在本月16日运行,则执行时间应为05:00 PM.

我可以做一份工作吗?下面是我完成的一半脚本:

BEGIN
 dbms_scheduler.create_job (
   job_name        => 'PROCESS_MY_JOB_X',
   JOB_TYPE        => 'PLSQL_BLOCK',
   JOB_ACTION      => 'MY_PACKAGE_X.MY_PROCEDURE_X',
   START_DATE      =>  TO_DATE('01-11-2014 10:00','DD-MM-YYYY HH24:MI'),
   repeat_interval => 'FREQ=DAILY; INTERVAL=14', 
   ENABLED         =>  TRUE,
   comments        => 'RUN JOB ON 1ST AND 16TH OF EVERY MONTH');
END;
/
Run Code Online (Sandbox Code Playgroud)

在此先感谢;)

oracle jobs plsql scheduler oracle11g

4
推荐指数
1
解决办法
7842
查看次数

Oracle 从 xmltype 中提取值

这是我目前使用的代码:

SET serveroutput ON
CREATE OR REPLACE
PROCEDURE test_proc(i_xml varchar2)
IS

l_name VARCHAR2(20);
l_age NUMBER;
l_xml xmltype;
BEGIN
l_xml := xmltype(i_xml);


FOR x IN
(SELECT VALUE(p) col_val
FROM TABLE(XMLSEQUENCE(EXTRACT(l_xml, '/ROWSET/ROW'))) p
)
LOOP

     IF x.col_val.existSNode('/ROW/name/text()') > 0 THEN
          l_name:= x.col_val.EXTRACT('/ROW/name/text()').getstringVal();
     END IF;
     IF x.col_val.existSNode('/ROW/age/text()') > 0 THEN
          l_age := x.col_val.EXTRACT('/ROW/age/text()').getstringVal();
     END IF;
end loop;

end;
/
BEGIN
test_proc('<ROWSET>
<ROW>
<name>aa</name>
<age>20</age>
</ROW>
<ROW>
<name>bbb</name>
<age>25</age>
</ROW>
</ROWSET>');
END;
/
Run Code Online (Sandbox Code Playgroud)

上面的代码使用 xml 来提取现有节点值并将其保存到特定的局部变量中。它被用于多组数据的案例中,并且工作正常。我只是想知道我是否可以在没有“for x 循环”的情况下使用相同的数据,因为从现在开始我将在 i_xml 中只有一个数据,我将只有 nameorage标签。 …

oracle plsql extract xmltype

3
推荐指数
1
解决办法
4万
查看次数

在oracle中交换逗号分隔值

我有一个表,其中一列具有逗号分隔值,(例如:经度,纬度,经度1,纬度1等).

现在我需要交换像(纬度,经度,纬度1,经度1等)的值.

至于试用目的:我创建了一个表如下:

CREATE TABLE string_table
     (
          slno       NUMBER,
          old_string VARCHAR2(50),
          new_string VARCHAR2(50)
     );
/
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (1, '1,2,3,4,5,6');
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (2, '1,2,3,4,5');
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (3, 'a,b,c,d,e,f');
INSERT INTO STRING_TABLE (SLNO, OLD_STRING)
       VALUES (4, 'a,b,c,d,e');
COMMIT;
/
Run Code Online (Sandbox Code Playgroud)

现在表格如下:

slno  old_string  new_string                                         
----- ----------------------
1    1,2,3,4,5,6                                                                                           
2    1,2,3,4,5                                                                                             
3    a,b,c,d,e,f                                                                                           
4    a,b,c,d,e    
Run Code Online (Sandbox Code Playgroud)

我需要将交换的值更新为new_string列,结果应如下所示:

slno  old_string  new_string                                         
----- ----------------------
1    1,2,3,4,5,6    2,1,4,3,6,5
2    1,2,3,4,5      2,1,4,3,5
3    a,b,c,d,e,f    b,a,d,c,f,e
4    a,b,c,d,e …
Run Code Online (Sandbox Code Playgroud)

sql plsql oracle11g

2
推荐指数
1
解决办法
697
查看次数

Oracle正则表达式从上次出现时拆分字符串

我仍在学习oracle中的regexp我被困在中间,下面是我的示例代码:

with t(val)
as
(
  --format: xyz_year_month_date
  select 'my_new_table_2015_06_31' from dual
  union all
  select 'my_new_table_temp_2016_06_31' from dual
 )
 select reverse(regexp_substr(reverse(val),'[^_]+',1,4)) col4,
 reverse(regexp_substr(reverse(val),'[^_]+',1,3)) col3,
 reverse(regexp_substr(reverse(val),'[^_]+',1,2)) col2,
 reverse(regexp_substr(reverse(val),'[^_]+',1,1)) col1
 from t;

Output:
COL4 COL3 COL2 COL1
table 2015 06 31
temp 2016 06 31

Expected output:
COL4 COL3 COL2 COL1
my_new_table 2015 06 31
my_new_table_temp 2016 06 31
Run Code Online (Sandbox Code Playgroud)

提前致谢.

regex sql oracle oracle11g

0
推荐指数
1
解决办法
789
查看次数