Oracle / SQL计数来自一个列的不同值并将其存储在变量中

时间:2014-11-24 17:19:11

标签: sql oracle plsql

我真的需要知道我是否可以在一个列中计算4个不同的值并将其存储在4个不同的变量中。这些变量将在稍后的程序中使用。

这是我的代码,但我不想使用select语句4次,但最好是1次。 有什么办法可以解决吗?

create or replace PROCEDURE FCountPrizes (dData IN DATE) 
IS 
szostki NUMBER; 
piatki NUMBER; 
czworki NUMBER; 
trojki NUMBER; 
BEGIN 
SELECT COUNT(*) into szostki FROM Losy WHERE dData=DataLosowania AND FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) = 6; 
SELECT COUNT(*) into piatki FROM Losy WHERE dData=DataLosowania AND FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) = 5; 
SELECT COUNT(*) into czworki FROM Losy WHERE dData=DataLosowania AND FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) = 4; 
SELECT COUNT(*) into trojki FROM Losy WHERE dData=DataLosowania AND FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) = 3; 
END;

4 个答案:

答案 0 :(得分:1)

SELECT sum(case FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) when 6 then 1 else 0 end), 
       sum(case FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) when 5 then 1 else 0 end),   
       sum(case FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) when 4 then 1 else 0 end),   
       sum(case FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) when 3 then 1 else 0 end)
into szostki, piatki, czworki, trojki 
FROM Losy WHERE dData=DataLosowania;

根据评论,用nvl:

包装每个总和
NVL(sum(case FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) 
        when 3 then 1 else 0 end), 
    0)

如果你不想在你的局部变量中使用NULL。

另一种选择:

SELECT max(case func_res when 6 then n else null end), 
       max(case func_res when 5 then n else null end),   
       max(case func_res when 4 then n else null end),   
       max(case func_res when 3 then n else null end)
       into szostki, piatki, czworki, trojki 
FROM (
    SELECT FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) as func_res, count(*) as n
    FROM Losy WHERE dData=DataLosowania
    GROUP BY FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze)
);

答案 1 :(得分:0)

create or replace PROCEDURE FCountPrizes (dData IN DATE) 
IS
SELECT COUNT(DECODE(CountGuessed(dData, LiczbyMniejsze, LiczbyWieksze),6,1)) ,
       COUNT(DECODE(CountGuessed(dData, LiczbyMniejsze, LiczbyWieksze),5,1)) ,
       COUNT(DECODE(CountGuessed(dData, LiczbyMniejsze, LiczbyWieksze),4,1)) ,
       COUNT(DECODE(CountGuessed(dData, LiczbyMniejsze, LiczbyWieksze),3,1))
INTO   
       szostki,
       piatki,
       czworki,
       trojki
FROM Losy
 WHERE dData=DataLosowania 
END FCountPrizes;
/

答案 2 :(得分:0)

这是您的数据。

SELECT FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) value, COUNT(*) records
FROM Losy 
WHERE dData=DataLosowania 
AND FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) in (3,4,5,6)
GROUP BY FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze);

您可以运行一次并对结果执行某些操作。你有选择。

答案 3 :(得分:0)

查询的PIVOT版本如下所示:

select * from (
  select FCountGuessed(dData, LiczbyMniejsze, LiczbyWieksze) f
  from Losy
  where dData=DataLosowania
)
pivot (
  count(*) for (f) in (
    6 as szostki,
    5 as piatki,
    4 as czworki,
    3 as trojki
  )
)