[英]In PLSQL How to put result of conditional aggregation into variable?
我使用以下查询来计算标记为便宜、公平和扩展的行数
select
sum(case when price_category = 'CHEAP' then 1 else 0 end) AS cheap,
sum(case when price_category = 'FAIR' then 1 else 0 end) AS fair,
sum(case when price_category = 'EXPANSIVE' then 1 else 0 end) AS expansive
from t;
现在我如何将计数值放入 3 个不同的变量中?
使用这样的示例数据:
WITH t AS
(
SELECT 1 "ID", 'CHEAP' "PRICE_CATEGORY" FROM DUAL UNION ALL
SELECT 2 "ID", 'CHEAP' "PRICE_CATEGORY" FROM DUAL UNION ALL
SELECT 3 "ID", 'FAIR' "PRICE_CATEGORY" FROM DUAL UNION ALL
SELECT 4 "ID", 'EXPENSIVE' "PRICE_CATEGORY" FROM DUAL UNION ALL
SELECT 5 "ID", 'FAIR' "PRICE_CATEGORY" FROM DUAL UNION ALL
SELECT 6 "ID", 'CHEAP' "PRICE_CATEGORY" FROM DUAL UNION ALL
SELECT 7 "ID", 'CHEAP' "PRICE_CATEGORY" FROM DUAL
)
使用 cursor for 循环将完成您要求的工作。 您选择的结果将在那里为您定义变量的值。 您可以使用 sql 将结果放入 3 个不同的变量中,如下所示
SET SERVEROUTPUT ON
Declare
m_Cheap Number;
m_Fair Number;
m_Expensive Number;
Begin
FOR recCount IN
(
select
sum(case when price_category = 'CHEAP' then 1 else 0 end) AS cheap,
sum(case when price_category = 'FAIR' then 1 else 0 end) AS fair,
sum(case when price_category = 'EXPENSIVE' then 1 else 0 end) AS expensive
from t
) LOOP
m_Cheap := recCount.CHEAP;
DBMS_OUTPUT.PUT_LINE('CHEAP = ' || m_Cheap);
m_Fair := recCount.FAIR;
DBMS_OUTPUT.PUT_LINE('FAIR = ' || m_Fair);
m_Expensive := recCount.EXPENSIVE;
DBMS_OUTPUT.PUT_LINE('EXPENSIVE = ' || m_Expensive);
END LOOP;
End;
-- R e s u l t
--
-- anonymous block completed
-- CHEAP = 4
-- FAIR = 2
-- EXPENSIVE = 1
你也可以这样做:
select
sum(case when price_category = 'CHEAP' then 1 else 0 end) AS cheap,
sum(case when price_category = 'FAIR' then 1 else 0 end) AS fair,
sum(case when price_category = 'EXPENSIVE' then 1 else 0 end) AS expensive
INTO m_Cheap, m_Fair, m_Expensive
from t
使用相同的 PL/SQL 声明部分和相同的 DBMS_OUTPUT.PUT_LINE 命令,结果与上述相同。
使用SELECT ... INTO ... FROM ...
:
DECLARE
v_fair PLS_INTEGER;
v_cheap PLS_INTEGER;
v_expansive PLS_INTEGER;
BEGIN
SELECT sum(case when price_category = 'CHEAP' then 1 else 0 end) AS cheap,
sum(case when price_category = 'FAIR' then 1 else 0 end) AS fair,
sum(case when price_category = 'EXPANSIVE' then 1 else 0 end) AS expansive
INTO v_cheap,
v_fair,
v_expansive
FROM t;
DBMS_OUTPUT.PUT_LINE( v_cheap || ', ' || v_fair || ', ' || v_expansive );
END;
/
其中,对于样本数据:
CREATE TABLE t (price_category) AS
SELECT 'CHEAP' FROM DUAL CONNECT BY LEVEL <= 42 UNION ALL
SELECT 'FAIR' FROM DUAL CONNECT BY LEVEL <= 17 UNION ALL
SELECT 'EXPANSIVE' FROM DUAL CONNECT BY LEVEL <= 99;
输出:
42, 17, 99
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.