Oracle期初和期末余额-需要SQL还是PL/SQL?

Oracle期初和期末余额-需要SQL还是PL/SQL?,sql,oracle,Sql,Oracle,输出如下(这里的打开和关闭不是由查询生成的,但我要求必须来自查询) 我需要如上所述生成输出。在这里,PROD_ID,CUSTOMER_ID-wise动态地将上一个期末余额填充为期初,并且它应该按月、按客户、按产品计算期末余额(期初+已赚支出)。是否可以用SQL编写或需要使用PL/SQL?您的案例需要否则 YEAR MONTH PROD CUSTOMER OPENING EARNED SPEND CLOSING ---- ----- ---- -------- ------- ------ --

输出如下(这里的打开和关闭不是由查询生成的,但我要求必须来自查询)


我需要如上所述生成输出。在这里,PROD_ID,CUSTOMER_ID-wise动态地将上一个期末余额填充为期初,并且它应该按月、按客户、按产品计算期末余额(期初+已赚支出)。是否可以用SQL编写或需要使用PL/SQL?

您的
案例
需要
否则

YEAR MONTH PROD CUSTOMER OPENING EARNED SPEND CLOSING 
---- ----- ---- -------- ------- ------ ----- -------
2012     8  548    12033       0      8     2       6
2012     9  509    12033       0     24     0      24
2012     9  509    12047       0     14     0      14
2012     9  548    12033       6      1     0       7
2012     9  548    12047       0      1     0       1
D.OP_TYPE
不等于
1
,且任何+
NULL
=
NULL
时,如果没有else,则
案例将返回
NULL
。当您的
不满足时,
返回
NULL
,这就是为什么您没有看到这些列的任何内容

要按您可能需要的方式计算期初和期末,请使用
LEAD
LAG

CASE WHEN D.OP_TYPE = 1 THEN d.qty ELSE 0 END

我会使用分析,在分区子句中使用PROD_ID和CUSTOMER_ID,以避免产品和客户的混合

Select year,month,prod_id,customer_id,
       LAG(closing,1,0) OVER (order by year,month,prod_id,customer_id) as opening,
       earned,spend
      ,(LAG(closing,1,0) OVER (order by year,month,prod_id,customer_id)+closing) as closing
from (WITH temp AS (select year, 
                           month ,
                           d.PROD_ID, 
                           T.CUSTOMER_ID,
                           0 OPEN,
                          SUM(CASE WHEN D.OP_TYPE = 1 THEN d.qty END)    EARNED,
                          SUM(CASE WHEN D.OP_TYPE = 2 THEN d.qty END)    SPEND,
                          0 CLOSE
                     FROM TXN_HEADER T  , 
                          TXN_DETAIL d , 
                          CUSTOMER A,
                          PRODUCT e 
                    WHERE T.AMOUNT > 0 
                      AND   A.TYPE  =  0
                      AND   T.CUSTOMER_ID = A.CUSTOMER_ID
                      AND   T.TXN_PK = D.TXN_PK 
                      and   d.PROD_ID = e.PROD_ID
                      and   e.unit = 0
                     group by year, month ,d.PROD_ID, T.CUSTOMER_ID
                     ORDER BY 1,2,3,4)
   SELECT year,month,prod_id,customer_id,open,earned,spend,(open+earned-spend) as closing
     from temp);

你的CAPS LOCK钥匙卡住了吗?请把它解开。它错开了。。对不起,我把这些列留空了,bcos我不知道如何计算这些打开和关闭的运行时间
Select year,month,prod_id,customer_id,
       LAG(closing,1,0) OVER (order by year,month,prod_id,customer_id) as opening,
       earned,spend
      ,(LAG(closing,1,0) OVER (order by year,month,prod_id,customer_id)+closing) as closing
from (WITH temp AS (select year, 
                           month ,
                           d.PROD_ID, 
                           T.CUSTOMER_ID,
                           0 OPEN,
                          SUM(CASE WHEN D.OP_TYPE = 1 THEN d.qty END)    EARNED,
                          SUM(CASE WHEN D.OP_TYPE = 2 THEN d.qty END)    SPEND,
                          0 CLOSE
                     FROM TXN_HEADER T  , 
                          TXN_DETAIL d , 
                          CUSTOMER A,
                          PRODUCT e 
                    WHERE T.AMOUNT > 0 
                      AND   A.TYPE  =  0
                      AND   T.CUSTOMER_ID = A.CUSTOMER_ID
                      AND   T.TXN_PK = D.TXN_PK 
                      and   d.PROD_ID = e.PROD_ID
                      and   e.unit = 0
                     group by year, month ,d.PROD_ID, T.CUSTOMER_ID
                     ORDER BY 1,2,3,4)
   SELECT year,month,prod_id,customer_id,open,earned,spend,(open+earned-spend) as closing
     from temp);
WITH
MONTHLY_BALANCE AS
(
  SELECT
    YEAR,
    MONTH,
    D.PROD_ID,
    T.CUSTOMER_ID,
    SUM(CASE WHEN D.OP_TYPE = 1 THEN D.QTY ELSE NULL END) EARNED,
    SUM(CASE WHEN D.OP_TYPE = 2 THEN D.QTY ELSE NULL END) SPEND,
  FROM TXN_HEADER T
  JOIN CUSTOMER A 
  ON    T.CUSTOMER_ID = A.CUSTOMER_ID
  JOIN TXN_DETAIL D
  ON    T.TXN_PK = D.TXN_PK
  JOIN PRODUCT E
  ON    D.PROD_ID = E.PROD_ID
  WHERE T.AMOUNT > 0
  AND   A.TYPE = 0
  AND   E.UNIT = 0
  GROUP BY YEAR, MONTH, D.PROD_ID, T.CUSTOMER_ID
)
SELECT
  YEAR,
  MONTH,
  PROD_ID,
  CUSTOMER_ID,
  SUM(NVL(EARNED, 0) - NVL(SPEND, 0)) OVER(PARTITION BY PROD_ID, CUSTOMER_ID ORDER BY YEAR, MONTH ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) OPENING,
  EARNED,
  SPEND,
  SUM(NVL(EARNED, 0) - NVL(SPEND, 0)) OVER(PARTITION BY PROD_ID, CUSTOMER_ID ORDER BY YEAR, MONTH ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT_ROW) CLOSING
FROM MONTHLY_BALANCE
ORDER BY 1, 2, 3, 4