DECLARE
var1 INTEGER :=0;
var2 INTEGER :=0;
BEGIN
SELECT DISTINCT
<whatever here>
CASE
WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN var1+1
WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN var2+1
ELSE 0
END
FROM
<Rest of query here>
基本上我想要做的是将1添加到局部变量然后使用count(或计数的总和)或者每次的差异打印出该变量的值作为我的select语句的一部分年龄属于这些类别
我不确定如何基本上添加到局部变量。
答案 0 :(得分:2)
SELECT
sum(CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1 ELSE 0 END) + var1,
sum(CASE WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN 1 ELSE 0 END) + var2
into var1, var2
FROM
<Rest of query here>
答案 1 :(得分:1)
尝试分析功能
BEGIN
SELECT DISTINCT
<whatever here>
sum(CASE
WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1
end) over() var1,
sum(CASE
WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN 1
END) over() var2
FROM
<Rest of query here>
答案 2 :(得分:1)
鉴于艾伦的评论,也许你正在寻找的东西比而不是:
SELECT V.*,
case when t1 is not null then
count(t1) over (ORDER BY n ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
when t2 is not null then
count(t2) over (ORDER BY n ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
else
0
end varX
FROM (
SELECT DISTINCT
<whatever here>
ROWNUM n,
CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1 END t1,
CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 11 AND 20 THEN 1 END t2
FROM
<Rest of query here>
) V
您可以检查一下这是否是您要查找的内容:http://sqlfiddle.com/#!4/2de0d/2
内部查询基本上是你的,加上
ROWNUM
列(如果您以某种方式ORDER BY
行,可能没有必要)NULL
NULL
外部查询使用分析函数COUNT() OVER(...)
分别计算当前行和结果集中第一个之间的标记数。此处使用行号n
。如果您的数据已经订购,请将其替换为更相关的内容。
答案 3 :(得分:0)
我不认为您可以在执行查询时更新某些变量。您所能做的就是将结果值提取到某个变量中。
使用COUNT
代替SUM
,对多重同步的回答略有不同:
SELECT
count(CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1 END) ,
count(CASE WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN 1 END)
into var1, var2
FROM
<Rest of query here>
这实际上将返回一行结果,其中值的计数是第一列中的第一个范围,第二列中第二个范围中的值的计数。使用INTO var1,var2
子句,PL / SQL将隐式地将这些值提取到局部变量中。