繁体   English   中英

在PLSQL中如何将条件聚合的结果放入变量中?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM