0

好吧,我将直接讨论在尝试使用 Extract 制作一本书时呈现给我的案例,并且必须保持连续平衡。

我真的在咨询,我找不到任何想要的解决方案。

感谢会为你们中的一些人做出一些小小的贡献。

我正在寻找这样的东西:

        ACCDATE     ACCOUNT DEBIT    CREDIT    BALANCE
2013-01-01 00:00:00 11200    0.00    1500.00 -1500.00
2013-01-01 00:00:00 11200    0.00    60.00   -1560.00
2013-01-01 00:00:00 11200    0.00    400.00  -1960.00
2013-01-01 00:00:00 11200    0.00    100.00  -2060.00
2013-01-01 00:00:00 11200    0.00    300.00  -2360.00
2013-01-01 00:00:00 11200    0.00    250.00  -2910.00

或者:

        ACCDATE     ACCOUNT DEBIT    CREDIT   BALANCE
2013-01-01 00:00:00 11200    1500.00 0       1500.00
2013-01-01 00:00:00 11200    0.00    60.00   1440.00
2013-01-01 00:00:00 11200    0.00    400.00  1040.00
2013-01-01 00:00:00 11200    0.00    40      1000.00
2013-01-01 00:00:00 11200    300     0       1300.00
2013-01-01 00:00:00 11200    0.00    250.00  1550.00

这个时候我真的不需要帐户类型过滤它,而是具体的。

这个想法是,我的 Query 仍然没有给我那个结果。

他们可以购买创建一个临时或临时表,如下所示:

INSERT INTO Accounting (AccDate,DebitCredit,Account,Amount) VALUES ('20110101','D',11200,1500)
INSERT INTO Accounting (AccDate,DebitCredit,Account,Amount) VALUES ('20110101','C',11200,60)
INSERT INTO Accounting (AccDate,DebitCredit,Account,Amount) VALUES ('20110102','D',11200,400)
INSERT INTO Accounting (AccDate,DebitCredit,Account,Amount) VALUES ('20110102','C',11200,100)
INSERT INTO Accounting (AccDate,DebitCredit,Account,Amount) VALUES ('20110102','C',11200,300)
INSERT INTO Accounting (AccDate,DebitCredit,Account,Amount) VALUES ('20110102','C',11200,250)

WITH CTE_FIRST AS
(
    SELECT ACCDATE,
        ACCOUNT,
        CASE WHEN DEBITCREDIT='D' THEN AMOUNT ELSE 0 END AS DEBIT,
        CASE WHEN DEBITCREDIT='C' THEN AMOUNT ELSE 0 END AS CREDIT,
        ROW_NUMBER()OVER(ORDER BY ACCOUNT,ACCDATE) RN
    FROM ACCOUNTING
    WHERE ACCDATE >='20130101'

)
,CTE_SECOND AS( 
    SELECT *,
          ISNULL((SELECT TOP 1 DEBIT FROM CTE_FIRST B WHERE B.ACCOUNT=A.ACCOUNT AND B.RN<A.RN ORDER BY RN DESC),0) COL1,
          ISNULL((SELECT TOP 1 CREDIT FROM CTE_FIRST B WHERE B.ACCOUNT=A.ACCOUNT AND B.RN<A.RN ORDER BY RN DESC),0) COL2
    FROM CTE_FIRST A
)

SELECT ACCDATE,ACCOUNT,DEBIT,CREDIT,
    CASE WHEN DEBIT=0 THEN 0-(CREDIT+COL2) ELSE DEBIT+COL1 END BALANCE
FROM CTE_SECOND

在验证总和时会发生一些事情,或者是否需要如此线性的咨询......

所有这些调查,我都试图帮助我处理我在网上获得的材料。但它给了我全部的回应。

4

1 回答 1

0

最后我得到了这个解决方案,但是这个过程变得非常缓慢。

有没有办法优化它?

真的很慢,它不适用于高查询。

声明 @T 表(FECHA 日期时间,COMMENTARIO NVARCHAR (300),CUENTA VARCHAR(15),DEBE NUMERIC(15,2),HABER NUMERIC(15,2))

插入@T SELECT FECHA、COMMENTARIO、CUENTA、DEBE、来自 DIARIOAPUNTES 的 HABER;

/* 插入@T 值 ('001-0001','20130102',100,0); 插入@T 值('001-0001','20130102',0,200);插入@T 值 ('001-0001','20130102',100,0); 插入@T 值 ('001-0001','20130103',100,0); 插入@T 值 ('001-0001','20130105',0,100); 插入@T 值 ('001-0002','20130105',100,0); 插入@T 值 ('001-0002','20130106',500,0); */
--借方-贷方+余额

使用 T_ROW 作为(SELECT (ROW_NUMBER() OVER(ORDER BY (T1_1.FECHA) ASC)) 作为 CONTADOR、FECHA、T1_1.CUENTA、T1_1.COMENTARIO、T1_1.DEBE、T1_1.HABER 来自@T T1_1)

选择 T1.CONTADOR,T1.CUENTA,T1.COMENTARIO 作为描述,转换(CHAR(10),T1.FECHA,103)作为 FECHA,T1.DEBE,T1.HABER,ROUND(T1.DEBE-T1.HABER + COALESCE (T2.SALDO,0),2) 作为 T_ROW T1 中的 SALDO 交叉应用(选择 ROUND(SUM(DEBE)-SUM(HABER),2) 作为 T_ROW T2 中的 SALDO,其中 T2.CONTADOR < T1.CONTADOR 和 T1.CUENTA = T2.CUENTA ) AS T2 --WHERE T1.FECHA BETWEEN '20130101' AND '20131231' ORDER BY T1.CUENTA, T1.FECHA --WHERE T1.ACCOUNTNO = '001-0001'

于 2013-08-13T14:07:32.267 回答