大家好,请看下面的查询,看看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
答案 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