# E29 MR40219.java 原始 sql ```sql SELECT MAUR_BNOB_D.*, TNOB_SDATE, BNOB_PITEM, BNOH_CHDATE, BNOB_CHDATE, BASC_DEPT.DEPT_NAME, DEPT2.DEPT_NAME AS DEPT2_MNAME, MNO_MNAME, case nvl(BNOB_D_USEQTY,0) WHEN 0 THEN 0 ELSE to_number(to_char(TO_DATE(TNOB_SDATE+19110000,'yyyymmdd')+CEIL((BNOB_D_STQTY+BNOB_D_QTY)/BNOB_D_USEQTY),'yyyymmdd'))-19110000 END AS BNOB_D_NEXTDATE FROM MAUR_BNOB_D, MAUR_BNOB, MAUR_BNOH, MAUR_TNOB, BASC_DEPT_ALL BASC_DEPT, BASC_DEPT DEPT2, BASC_MNO WHERE -- MAUR_BNOB_D x MAUR_BNOB BNOB_D_ANO=BNOB_ANO AND BNOB_D_CHKIND=BNOB_CHKIND AND BNOB_D_CHYY=BNOB_CHYY AND BNOB_D_CHSEQ=BNOB_CHSEQ AND BNOB_D_SEQ=BNOB_SEQ AND -- MAUR_BNOH x MAUR_BNOB_D BNOH_ANO=BNOB_D_ANO AND BNOH_CHKIND=BNOB_D_CHKIND AND BNOH_CHYY=BNOB_D_CHYY AND BNOH_CHSEQ=BNOB_D_CHSEQ AND -- MAUR_BNOH, MAUR_BNOB x MAUR_TNOB TNOB_ANO=BNOH_ANO AND TNOB_MKKIND=BNOH_MKKIND AND TNOB_MKYY=BNOH_MKYY AND TNOB_MKSEQ=BNOH_MKSEQ AND TNOB_SEQ=BNOB_SEQ AND -- MAUR_BNOB_D x BASC_DEPT -- MAUR_BNOB_D x BASC_DEPT 2 -- MAUR_BNOB_D x BASC_MNO BNOB_D_ANO3=BASC_DEPT.DEPT_ANO AND SUBSTR(BNOB_D_ANO3, 0, 4)=DEPT2.DEPT_ANO AND BNOB_MNO=MNO_MNO AND (to_date(TO_CHAR(TNOB_SDATE+19110000),'yyyymmdd')>=to_date(20220101,'yyyymmdd')) AND (to_date(TO_CHAR(TNOB_SDATE+19110000),'yyyymmdd')<=to_date(20220810,'yyyymmdd')) AND -- 起迄日 -- 判斷區處、場站範圍 (BNOB_D_ANO LIKE '06%') AND -- 限制只能查詢藥品類 BNOB_MNO LIKE 'N0%' ORDER BY DEPT2_MNAME, MNO_MNAME, BNOB_D_ANO3 ,BNOB_PITEM, TNOB_SDATE ``` 應改作類似: ```sql SELECT A.* , B.BNOB_PITEM, C.BNOH_CHDATE, B.BNOB_CHDATE, E1.DEPT_NAME, E2.DEPT_NAME AS DEPT2_MNAME, F.MNO_MNAME, CASE NVL(BNOB_D_USEQTY,0) WHEN 0 THEN 0 ELSE TO_NUMBER(TO_CHAR(TO_DATE(TNOB_SDATE+19110000,'YYYYMMDD')+CEIL((BNOB_D_STQTY+BNOB_D_QTY)/BNOB_D_USEQTY),'YYYYMMDD'))-19110000 END AS BNOB_D_NEXTDATE FROM MAUR_BNOB_D A LEFT JOIN MAUR_BNOB B ON A.BNOB_D_ANO=B.BNOB_ANO AND A.BNOB_D_CHKIND=BNOB_CHKIND AND A.BNOB_D_CHYY=B.BNOB_CHYY AND A.BNOB_D_CHSEQ=B.BNOB_CHSEQ AND A.BNOB_D_SEQ=B.BNOB_SEQ LEFT JOIN MAUR_BNOH C ON C.BNOH_ANO=A.BNOB_D_ANO AND C.BNOH_CHKIND=A.BNOB_D_CHKIND AND C.BNOH_CHYY=A.BNOB_D_CHYY AND C.BNOH_CHSEQ=A.BNOB_D_CHSEQ LEFT JOIN MAUR_TNOB D ON D.TNOB_ANO=C.BNOH_ANO AND D.TNOB_MKKIND=C.BNOH_MKKIND AND D.TNOB_MKYY=C.BNOH_MKYY AND D.TNOB_MKSEQ=C.BNOH_MKSEQ AND D.TNOB_SEQ=B.BNOB_SEQ LEFT JOIN BASC_DEPT_ALL E1 ON A.BNOB_D_ANO3=E1.DEPT_ANO LEFT JOIN BASC_DEPT E2 ON SUBSTR(A.BNOB_D_ANO3, 0, 4)=E2.DEPT_ANO LEFT JOIN BASC_MNO F ON B.BNOB_MNO=F.MNO_MNO where 1=1 AND A.BNOB_D_ANO LIKE '06%' AND B.BNOB_MNO LIKE 'N0%' ORDER BY E2.DEPT_NAME, F.MNO_MNAME, A.BNOB_D_ANO3 ,B.BNOB_PITEM, D.TNOB_SDATE ``` 應該用 partition by, max() 先取得各分類數目決定頁數後再印製 這樣程式碼比較不會太複雜,類似這樣: ```sql SELECT A.DEPT_NAME, A.DEPT2_MNAME, MAX(A.SEQ) 資料數, CEIL(MAX(A.SEQ)/24) 頁數 FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY E1.DEPT_ANO, E2.DEPT_ANO ORDER BY C.BNOH_CHDATE) AS SEQ, A.* , B.BNOB_PITEM, C.BNOH_CHDATE, B.BNOB_CHDATE, E1.DEPT_NAME, E2.DEPT_NAME AS DEPT2_MNAME, F.MNO_MNAME, CASE NVL(BNOB_D_USEQTY,0) WHEN 0 THEN 0 ELSE TO_NUMBER(TO_CHAR(TO_DATE(TNOB_SDATE+19110000,'YYYYMMDD')+CEIL((BNOB_D_STQTY+BNOB_D_QTY)/BNOB_D_USEQTY),'YYYYMMDD'))-19110000 END AS BNOB_D_NEXTDATE FROM MAUR_BNOB_D A LEFT JOIN MAUR_BNOB B ON A.BNOB_D_ANO=B.BNOB_ANO AND A.BNOB_D_CHKIND=BNOB_CHKIND AND A.BNOB_D_CHYY=B.BNOB_CHYY AND A.BNOB_D_CHSEQ=B.BNOB_CHSEQ AND A.BNOB_D_SEQ=B.BNOB_SEQ LEFT JOIN MAUR_BNOH C ON C.BNOH_ANO=A.BNOB_D_ANO AND C.BNOH_CHKIND=A.BNOB_D_CHKIND AND C.BNOH_CHYY=A.BNOB_D_CHYY AND C.BNOH_CHSEQ=A.BNOB_D_CHSEQ LEFT JOIN MAUR_TNOB D ON D.TNOB_ANO=C.BNOH_ANO AND D.TNOB_MKKIND=C.BNOH_MKKIND AND D.TNOB_MKYY=C.BNOH_MKYY AND D.TNOB_MKSEQ=C.BNOH_MKSEQ AND D.TNOB_SEQ=B.BNOB_SEQ LEFT JOIN BASC_DEPT_ALL E1 ON A.BNOB_D_ANO3=E1.DEPT_ANO LEFT JOIN BASC_DEPT E2 ON SUBSTR(A.BNOB_D_ANO3, 0, 4)=E2.DEPT_ANO LEFT JOIN BASC_MNO F ON B.BNOB_MNO=F.MNO_MNO WHERE 1=1 AND A.BNOB_D_ANO LIKE '06%' AND B.BNOB_MNO LIKE 'N0%' ORDER BY E2.DEPT_NAME, F.MNO_MNAME, A.BNOB_D_ANO3 ,B.BNOB_PITEM, D.TNOB_SDATE ) A GROUP BY A.DEPT_NAME, A.DEPT2_MNAME ```