【问题标题】:ORACLE find count based on two columnsORACLE 根据两列查找计数
【发布时间】:2016-10-07 18:04:53
【问题描述】:

我有一个 Oracle 数据库表,其中

我在这个特定的表中有很多列,但我想根据下面描述的两列之间的计算得到结果

Project|Status
-------|--------
 1     | Done    
 1     | Pending
 2     | Done

我想获取待处理项目的计数,例如,如果项目 1 的状态为待处理,并且它在表中的任何地方都没有完成状态,那么它将是待处理的任务,但如果项目 1 具有待处理的状态并且在任何其他行的表中也有一个完成状态,那么这将不是一个待处理的任务,

我已尝试过此查询,但它返回的行同时具有待处理和已完成状态,

SELECT * FROM MYTABLE T 
WHERE EXISTS
(SELECT 1 FROM MYTABLE WHERE Project = A.Project AND ROWID < A.ROWID AND            
Status ='Done') 
AND T.Status!='Done' AND T.Status='Pending'

@更新 我在此列中还有其他状态值,例如“部分完成”和“已请求”,因此我只想获取那些在整个表中只有待处理状态且没有“完成”状态的项目。

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    您可以使用HAVINGGROUP BY 来做到这一点:

    SELECT
        Project
    FROM MyTable t
    GROUP BY Project
    HAVING
        -- Should have at least one Pending status
        SUM(CASE WHEN Status = 'Pending' THEN 1 ELSE 0 END) > 0 
        -- No other status aside from Pending
        AND SUM(CASE WHEN Status <> 'Pending' THEN 1 ELSE 0 END) = 0
    

    【讨论】:

      【解决方案2】:

      如果您想获得未决项目并且没有其他状态“完成”,请使用以下查询。

      SELECT * FROM MYTABLE T 
      WHERE T.Status='Pending'
      AND NOT EXISTS --excluding projects with 'done' status
      (SELECT 1 FROM MYTABLE A WHERE A.Project = T.Project AND         
      A.Status ='Done') 
      

      如果您想获取待处理项目的总数,请使用以下脚本。

       SELECT COUNT(*) FROM MYTABLE T 
       WHERE T.Status='Pending'
          AND NOT EXISTS
          (SELECT 1 FROM MYTABLE A WHERE A.Project = T.Project AND         
          A.Status ='Done') 
      

      【讨论】:

      • 这就是我想要的。谢谢
      • 检查别名。
      【解决方案3】:

      一种方式不存在

      SELECT * FROM MYTABLE T 
      WHERE NOT EXISTS
         (SELECT 1 
          FROM MYTABLE T2 
          WHERE T2.Project = T.Project AND T.ROWID < T2.ROWID 
               AND T2.Status ='Done') 
      AND Status='Pending'
      

      不确定 AND T.ROWID &lt; T2.ROWID 。我最好使用日期时间列来指示状态变为实际的日期。此外,根据您的任务,它可以逆转AND T.ROWID &gt; T2.ROWID

      【讨论】:

        【解决方案4】:

        试试这个脚本:这将计算状态仅为Pending的项目

        SELECT Project,COUNT(Project) 
        FROM MYTABLE t1 
        WHERE NOT EXISTS(SELECT 1 FROM MYTABLE t2 WHERE t2.Project = t1.Project AND T2.Status='Done') 
        AND t1.Status='Pending' 
        GROUP BY Project 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-18
          • 2022-01-18
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 2019-10-03
          • 2015-03-24
          相关资源
          最近更新 更多