2015-08-31 217 views
-1

大家好,请看下面的查询,看看Oracle查询有什么问题。我已经使用了两个表,分别是Bill_masRemit_bill。非常感谢帮助。如何从Oracle中的查询中获取销售额和收款金额

查询:

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 
+0

什么是每个表中的所有主键和外键? –

+0

在查询中没有对y.bill_no的这种引用。 –

+0

@Iftekhar一般而言,在发布后你不应该改变你的问题,因为它可以使已经完成的所有答案(和工作)失效。 –

回答

1

您最外层的WHERE子句在内部查询Y中引用bill_no列,但此内部查询从未选择该列,因此我怀疑它不可用。要使bill_no列可用,您可以将JOINremit_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 
+0

感谢Tim.i执行您的查询,但没有运气。名称错误仍然存​​在。 – Iftekhar

+0

什么是新的错误信息? –

+0

WHERE X.bill_no = y.bill_no * 错误在第31行: ORA-06553:PLS-306:呼叫错误的数量或类型的参数 'OGC_Y' – Iftekhar