【问题标题】:oracle sql countsoracle sql 计数
【发布时间】:2020-02-25 05:38:16
【问题描述】:

如果portfolio id 有使用计数的股票代码。
例如Portfolio id 500stock_code 'IBM' 它算一个Portfolio id 500stock_code 'GBA' 它算两个

如果输入Portfolio id 500stock_code 'ABC'则为0 由于存在stock_code,因此不会引发错误消息。

Portfolio id   stock_code
    500            IBM
    500            GBA
    500            GBA


select count(distinct stock_code,portfolio_number)
into V_count 
from Stock 
where P_Stock_Code = stock_code
and P_Portfolio_number=portfolio_number;

显示错误

参数数量无效

传递两个INPUT参数

或者我无法使用计数验证 id 是否拥有stock_code??

【问题讨论】:

  • 我不明白你想达到什么目的。请更清楚地描述您的问题。
  • 如果我通过两个输入参数选择 PKG_Q4.FN_Q4('500','vf') from dual;它将计数为 0,因为 id 编号 500 没有股票代码 'vf'
  • 如果我选择 PKG_Q4.FN_Q4('500','GBA') 从双;它将计为 2,因为 id 号 500 有 2 个不同的“GBA”,时间不同
  • 好的。那你想做什么?您只想传递一个参数?您想单独计算所有 stock_code 吗?或者当您传递一个不存在的参数时,您希望看到 count 不是零而是 null ?
  • 我正在做一个 if else。 if count = 0 then .... if count >=1 then ...

标签: sql oracle count


【解决方案1】:

正如您已经理解的那样,您不能将两个参数传递给COUNT 函数。但是您可以改为执行以下操作。

WITH STOCK
     AS (SELECT 500 PORTFOLIO_ID, 'IBM' AS STOCK_CODE FROM DUAL
         UNION ALL
         SELECT 500 PORTFOLIO_ID, 'GBA' AS STOCK_CODE FROM DUAL
         UNION ALL
         SELECT 500 PORTFOLIO_ID, 'GBA' AS STOCK_CODE FROM DUAL)
SELECT CASE WHEN CNT = 0 THEN 'CASE1' WHEN CNT >= 1 THEN 'CASE2' END KEYZ
  FROM (  SELECT STOCK_CODE, COUNT (PORTFOLIO_ID) AS CNT
            FROM STOCK
        GROUP BY STOCK_CODE)

【讨论】:

    【解决方案2】:

    我认为您只是想检查 Passed P_Portfolio_number 是否有多少不同的 P_Stock_Code

    您可以使用以下内容:

    select count(distinct stock_code)
      into V_count -- 0,1,2 .. you can use it wherever you want then
      from Stock 
     where P_Stock_Code = stock_code
       and P_Portfolio_number=portfolio_number;
    

    干杯!!

    【讨论】:

      【解决方案3】:

      你可以使用下面的

      select count(1)
            into V_count
            from (select distinct stock_code, portfolio_number
                    from Stock
                   where P_Stock_Code = stock_code
                     and P_Portfolio_number = portfolio_number);
      

      【讨论】:

        【解决方案4】:

        Oracle 不支持COUNT DISTINCT 中的列列表。两年多前,我在 Oracle 的数据库创意门户中写了一个相应的请求:https://community.oracle.com/ideas/18664。您可以注册然后投票赞成这个想法。但是,我认为对于给定的情况,您不需要它。

        只需使用COUNT(*)。下面计算给定股票代码和投资组合编号组合的行数(1 代表 500|IBM,2 代表 500|GBA,0 代表 500|ABC)。

        在 PL/SQL 中:

        create or replace procedure myproc(p_stock_code varchar2, p_portfolio_number integer) as
          v_count  integer;
        begin
          select count(*)
          into v_count 
          from stock 
          where stock_code = p_stock_code
          and portfolio_number = p_portfolio_number;
        
          dbms_output.put_line(v_count);
        end myproc;
        

        在 SQL 中:

        select count(*)
        from stock 
        where stock_code = :p_stock_code
        and portfolio_number = :p_portfolio_number;
        

        【讨论】:

          猜你喜欢
          • 2015-12-09
          • 1970-01-01
          • 1970-01-01
          • 2023-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-12
          • 2021-04-11
          相关资源
          最近更新 更多