【问题标题】:How To Accumulator All The Values如何累积所有值
【发布时间】:2012-12-05 02:23:39
【问题描述】:

我想显示的输出是总 EMPL_NUM 的累加器。例如,字段 TOTAL_FEBRUARY=TOTAL_JANUARY+TOTAL_FEBRUARY 中显示的值,而字段 TOTAL_MARCH=TOTAL_MARCH+TOTAL_JANUARY+TOTAL_FEBRUARY 中的值存在。我希望你们中的一些人可以提供解决方案。非常感谢你。编码如下图:

SELECT 
(CASE WHEN To_Char(A.EFFDT,'MM')=01 THEN 1  
  WHEN To_Char(A.EFFDT,'MM')=02 THEN 2
  WHEN To_Char(A.EFFDT,'MM')=03 THEN 3
  WHEN To_Char(A.EFFDT,'MM')=04 THEN 4
  WHEN To_Char(A.EFFDT,'MM')=05 THEN 5
  WHEN To_Char(A.EFFDT,'MM')=06 THEN 6
  WHEN To_Char(A.EFFDT,'MM')=07 THEN 7
  WHEN To_Char(A.EFFDT,'MM')=08 THEN 8
  WHEN To_Char(A.EFFDT,'MM')=09 THEN 9
  WHEN To_Char(A.EFFDT,'MM')=10 THEN 10
  WHEN To_Char(A.EFFDT,'MM')=11 THEN 11
  WHEN To_Char(A.EFFDT,'MM')=12 THEN 12
  ELSE NULL END) AS MONTHS 

  ,Count(*) AS EMPL_NUM

  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=01 THEN 1 ELSE 0 END) AS TOTAL_JANUARY 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=02 THEN 1 ELSE 0 END) AS TOTAL_FEBRUARY 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=03 THEN 1 ELSE 0 END) AS TOTAL_MARCH 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=04 THEN 1 ELSE 0 END) AS TOTAL_APRIL  
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=05 THEN 1 ELSE 0 END) AS TOTAL_MAY 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=06 THEN 1 ELSE 0 END) AS TOTAL_JUN 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=07 THEN 1 ELSE 0 END) AS TOTAL_JULY  
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=08 THEN 1 ELSE 0 END) AS TOTAL_AUGUST 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=09 THEN 1 ELSE 0 END) AS TOTAL_SEPTEMBER 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=10 THEN 1 ELSE 0 END) AS TOTAL_OCTOBER
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=11 THEN 1 ELSE 0 END) AS TOTAL_NOVEMBER 
  ,Sum(CASE WHEN To_Char(A.EFFDT,'MM')=12 THEN 1 ELSE 0 END) AS TOTAL_DECEMBER 

  FROM PS_JOB A
 ,PS_CITIZEN_PSSPRT B
 ,PS_CITIZENSHIP C
 ,PS_CITIZEN_STS_TBL D

 WHERE A.HR_STATUS='A'

 AND A.EFFDT=(SELECT Max(A1.EFFDT) FROM PS_JOB A1 WHERE A.EMPLID=A1.EMPLID AND A.EMPL_RCD=A1.EMPL_RCD AND A1.EFFDT<=SYSDATE)

 AND A.EMPL_RCD=0

 AND A.EFFSEQ=(SELECT Max(A2.EFFSEQ) FROM PS_JOB A2 WHERE A.EMPLID=A2.EMPLID AND A.EMPL_RCD=A2.EMPL_RCD AND A.EFFDT=A2.EFFDT)

 AND A.EMPLID =B.EMPLID(+) 

 AND B.DEPENDENT_ID=' '

 AND A.EMPLID=C.EMPLID  

 AND B.EMPLID=C.EMPLID

 AND B.DEPENDENT_ID=C.DEPENDENT_ID

 AND B.COUNTRY=C.COUNTRY

 AND B.COUNTRY=D.COUNTRY                                    

 AND C.COUNTRY=D.COUNTRY

 AND C.CITIZENSHIP_STATUS=D.CITIZENSHIP_STATUS

 AND C.CITIZENSHIP_STATUS IN ('5','7') 

 AND To_Char(A.EFFDT,'YYYY')=2012

  GROUP BY CASE WHEN To_Char(A.EFFDT,'MM')=01 THEN 1  
  WHEN To_Char(A.EFFDT,'MM')=02 THEN 2
  WHEN To_Char(A.EFFDT,'MM')=03 THEN 3
  WHEN To_Char(A.EFFDT,'MM')=04 THEN 4
  WHEN To_Char(A.EFFDT,'MM')=05 THEN 5
  WHEN To_Char(A.EFFDT,'MM')=06 THEN 6
  WHEN To_Char(A.EFFDT,'MM')=07 THEN 7
  WHEN To_Char(A.EFFDT,'MM')=08 THEN 8
  WHEN To_Char(A.EFFDT,'MM')=09 THEN 9
  WHEN To_Char(A.EFFDT,'MM')=10 THEN 10
  WHEN To_Char(A.EFFDT,'MM')=11 THEN 11
  WHEN To_Char(A.EFFDT,'MM')=12 THEN 12
  ELSE NULL END 

此处输入代码

【问题讨论】:

    标签: sql accumulator accumulate


    【解决方案1】:

    计算 SUM 时使用

    Sum(CASE WHEN TO_NUMBER(To_Char(A.EFFDT,'MM')) <= 3 THEN 1 ELSE 0 END) AS TOTAL_MARCH
    

    【讨论】:

    • 您好,谢谢您的建议。它非常有用。但仍有 1 个问题让我在 2012 年 1 月表示我想在它之前显示所有 EMPL_NUM 的总数,例如 2011 年 12 月的总数,我怎么能做到?介意给我一些建议吗?thxz~
    【解决方案2】:

    我认为您要的是总和。查看分析函数(例如,psoug 站点)。如果查询的核心是正确的,请在内部查询中进行常规聚合,然后将其包装在分析函数中以获得运行总计。

    SELECT month
          ,SUM(month_count) OVER ( ROWS BETWEEN UNBOUNDED PRECEDING
                                            AND CURRENT ROW )
           AS running_total
    
    FROM (  SELECT To_Char(A.EFFDT,'MM') AS month
                  ,COUNT(*) AS month_count
    
              FROM PS_JOB A
                  ,PS_CITIZEN_PSSPRT B
                  ,PS_CITIZENSHIP C
                  ,PS_CITIZEN_STS_TBL D
    
              WHERE A.HR_STATUS='A'
    
                AND A.EFFDT=( SELECT Max(A1.EFFDT)
                                FROM PS_JOB A1 
                                WHERE A.EMPLID=A1.EMPLID
                                  AND A.EMPL_RCD=A1.EMPL_RCD
                                  AND A1.EFFDT<=SYSDATE )
    
                AND A.EMPL_RCD=0
    
                AND A.EFFSEQ=( SELECT Max(A2.EFFSEQ)
                                 FROM PS_JOB A2
                                 WHERE A.EMPLID=A2.EMPLID
                                   AND A.EMPL_RCD=A2.EMPL_RCD
                                   AND A.EFFDT=A2.EFFDT )
    
                AND A.EMPLID =B.EMPLID(+) 
    
                AND B.DEPENDENT_ID=' '
    
                AND A.EMPLID=C.EMPLID  
    
                AND B.EMPLID=C.EMPLID
    
                AND B.DEPENDENT_ID=C.DEPENDENT_ID
    
                AND B.COUNTRY=C.COUNTRY
    
                AND B.COUNTRY=D.COUNTRY                                    
    
                AND C.COUNTRY=D.COUNTRY
    
                AND C.CITIZENSHIP_STATUS=D.CITIZENSHIP_STATUS
    
                AND C.CITIZENSHIP_STATUS IN ('5','7') 
    
                AND To_Char(A.EFFDT,'YYYY')=2012
    
              GROUP BY To_Char(A.EFFDT,'MM')
    
         )
    
    ORDER BY month
    

    【讨论】:

    • 感谢您的建议。它非常有用。但是仍然有 1 个问题让我在 2012 年 1 月表示我想在它之前显示所有 EMPL_NUM 的总数,例如 2011 年 12 月的总数,我怎么能做到?介意给我一些建议吗?thxz~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多