我有一个简单的查询:
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) 这是一个简单的问题,我已经阅读了有关使用CASE
in 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行.
提前致谢.
我想将我的数据汇总到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输出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 …
将上面作为样本表的输出,我需要一个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 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).
谢谢
我在打包的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)
在此先感谢;)
这是我目前使用的代码:
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 中只有一个数据,我将只有
name
orage
标签。 …
我有一个表,其中一列具有逗号分隔值,(例如:经度,纬度,经度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) 我仍在学习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)
提前致谢.