2014-11-24 134 views
0

我真的需要知道,如果我能以某种方式计算列中的4个不同值并将其存储在4个不同的变量中。这些变量稍后将在该过程中使用。Oracle/SQL统计来自一列的不同值并将其存储在一个变量中

这是我的代码,但我不想使用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; 

回答

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) 
); 
+0

我没有给予好评的答案,但在技术上是有区别的。如果没有与'data'的匹配,那么这个查询得到的结果值为NULL,而原始值为0。 – 2014-11-24 17:26:25

+0

@Gordon Linoff谢谢你,你是对的 – Multisync 2014-11-24 17:29:38

+0

它的作品,这就是为什么我把它标记为最佳答案,但我仍然不确定它是否按我的意图工作。在我看来,FCountGuessed(dData,LiczbyMniejsze,LiczbyWieksze)在一个记录中执行了4次,这个功能非常复杂,这减慢了整个过程。我正在寻求一次执行它的选项并计算4种类型的结果。 – user3079680 2014-11-30 09:16:38

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; 
/
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); 

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

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 
) 
) 
相关问题