如何从Oracle中的查询中获取销售和收款金额值

时间:2015-08-31 03:58:11

标签: sql oracle subquery

大家好,请看下面的查询,看看Oracle查询的问题。我使用了两个名为 Bill_mas Remit_bill 的表。很有帮助。

查询:

SELECT x.sc_cd, x.rm_id, x.fm_id, x.bill_no, x.DELI_DT, X.SALE_NET, Y.RMT, Y.COLL
FROM
(
    SELECT sc_cd, rm_id, fm_id, bill_no, DELI_DT, SUM(sale_net) SALE_NET
    FROM BILL_MAS 
    WHERE DELI_DT BETWEEN '01-feb-15' and '28-feb-15'
    AND BILL_NO = '754105'
    AND sc_cd = '09'
    AND SALE_CD NOT IN ('RS','IN','EX')
    HAVING ROUND(SUM(SALE_NET),2) <= 1000
    GROUP BY sc_cd, rm_id, fm_id, bill_no, DELI_DT
) X,
(
    SELECT p.sc_cd, MAX(RMT_DT) RMT, SUM(p.COLL_AMT) COLL
    FROM REMIT_BILL P
    WHERE p.bill_no = '754105' 
    AND p.rmt_DT =
    (
        SELECT MAX(rmt_DT) FROM REMIT_BILL P2
        WHERE P2.bill_no = P.BILL_NO
        AND sc_cd = '09'
    )
    GROUP BY p.sc_cd, p.RMT_DT,p.COLL_AMT
) Y
WHERE X.bill_no = y.bill_no
AND X.sc_cd = y.sc_cd
ORDER BY 1

错误讯息:

WHERE X.bill_no=y.bill_no
                *
ERROR at line 18:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'OGC_Y'

表格:

SQL> 
SQL> desc bill_mas
 Name                            Null?    Type
 ------------------------------- -------- ----
 BILL_NO                         NOT NULL VARCHAR2(6)
 BILL_DT                         NOT NULL DATE
 ORDER_NO                                 VARCHAR2(6)
 ORDER_DT                                 DATE
 FP_ID                           NOT NULL VARCHAR2(5)
 SC_CD                           NOT NULL VARCHAR2(2)
 DIST_CD                                  VARCHAR2(2)
 THA_CD                                   VARCHAR2(2)
 UN_CD                                    VARCHAR2(3)
 CL_ID                                    VARCHAR2(3)
 SALE_CD                         NOT NULL VARCHAR2(2)
 SALE_GR                         NOT NULL NUMBER(10,2)
 SALE_NET                        NOT NULL NUMBER(10,2)
 DELI_DT                                  DATE
 FL_MVH                                   VARCHAR2(1)
 USER_CD                                  VARCHAR2(2)
 W_DT                                     DATE
 CANCL                                    VARCHAR2(1)
 B_VAT                                    NUMBER(9,2)
 RM_ID                                    VARCHAR2(5)
 FM_ID                                    VARCHAR2(5)
 BS_CD                                    VARCHAR2(4)
 C_TYP                                    VARCHAR2(1)
 COLL_TYP                                 VARCHAR2(1)

SQL> desc remit_bill
 Name                            Null?    Type
 ------------------------------- -------- ----
 SC_CD                           NOT NULL VARCHAR2(2)
 RMT_NO                          NOT NULL VARCHAR2(6)
 RMT_DT                                   DATE
 BILL_NO                         NOT NULL VARCHAR2(6)
 COLL_AMT                        NOT NULL NUMBER(10,2)

SQL> 

使用日期列 p.rmt_dt

进行查询
SELECT t1.bill_no, t2.sc_cd, t2.RMT, t2.COLL
    FROM REMIT_BILL t1 INNER JOIN
    (
        SELECT p.sc_cd sc_cd, MAX(RMT_DT) RMT, SUM(p.COLL_AMT) COLL
        FROM REMIT_BILL P
        --WHERE p.bill_no = '754105' 
        WHERE p.rmt_DT =
        (
            SELECT MAX(rmt_DT) FROM REMIT_BILL P2
            WHERE P2.bill_no = P.BILL_NO 
            AND sc_cd = '09' 
            AND P.RMT_DT BETWEEN '01-FEB-15' AND '28-FEB-15'
        )
        GROUP BY p.sc_cd, p.RMT_DT,p.COLL_AMT
    ) t2
    ON t1.sc_cd = t2.sc_cd AND t1.rmt_dt = t2.rmt 

1 个答案:

答案 0 :(得分:1)

您的最外层WHERE子句引用内部查询bill_no中的列Y,但此内部查询从未选择该列,因此我怀疑它不可用。要使bill_no列可用,您可以在JOIN查询中remit_bill Y表返回自身,然后按原样继续。尝试将您的查询更改为:

SELECT x.sc_cd, x.rm_id, x.fm_id, x.bill_no, x.DELI_DT, X.SALE_NET, Y.RMT, Y.COLL
FROM
(
    SELECT sc_cd, rm_id, fm_id, bill_no, DELI_DT, SUM(sale_net) SALE_NET
    FROM BILL_MAS 
    WHERE DELI_DT BETWEEN '01-feb-15' and '28-feb-15'
    AND BILL_NO = '754105'
    AND sc_cd = '09'
    AND SALE_CD NOT IN ('RS','IN','EX')
    HAVING ROUND(SUM(SALE_NET),2) <= 1000
    GROUP BY sc_cd, rm_id, fm_id, bill_no, DELI_DT
) X,
(
    SELECT t1.bill_no, t2.sc_cd, t2.RMT, t2.COLL
    FROM REMIT_BILL t1 INNER JOIN
    (
        SELECT p.sc_cd sc_cd, MAX(RMT_DT) RMT, SUM(p.COLL_AMT) COLL
        FROM REMIT_BILL P
        WHERE p.bill_no = '754105' 
        AND p.rmt_DT =
        (
            SELECT MAX(rmt_DT) FROM REMIT_BILL P2
            WHERE P2.bill_no = P.BILL_NO
            AND sc_cd = '09'
        )
        GROUP BY p.sc_cd, p.RMT_DT,p.COLL_AMT
    ) t2
    ON t1.sc_cd = t2.sc_cd AND t1.rmt_dt = t2.rmt
    WHERE t1.bill_no = '754105'
) Y
WHERE X.bill_no = y.bill_no
AND X.sc_cd = y.sc_cd
ORDER BY 1