首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 複雜了 [已结帖,结帖人:dingjiahappy]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-11-17 15:36:59 楼主
    SQL code
    select C.num_buy,C.cod_fact,f.nam_fact,C.cod_paym,D.content from buym c,CODD D,fact f where c.cod_paym<> (select cod_paym from (select A.NUM_BUY,A.COD_FACT,A.COD_PAYM,A.DAT_BUY FROM BUYM A LEFT JOIN (SELECT COD_FACT,MAX(DAT_BUY) DAT_BUY,max(num_buy) num_buy FROM BUYM where dat_buy <=(select to_char(last_day(add_months(sysdate, -1)),'yyyyMMdd') from dual)GROUP BY COD_FACT) B ON B.DAT_BUY=A.DAT_BUY AND B.COD_FACT=A.COD_FACT WHERE B.DAT_BUY=A.DAT_BUY AND B.COD_FACT=A.COD_FACT and b.num_buy=a.num_buy) t where c.cod_fact=t.cod_fact) and c.dat_buy >(select to_char(last_day(add_months(sysdate, -1)),'yyyyMMdd') from dual) and C.cod_paym=d.code and c.cod_fact=f.cod_fact


    这个sql的写成收到了csdn上朋友们的热情帮助,现在有新的问题想再请大家帮忙了
    在第3行和第4行有作比较,现在查询结果是显示的本月的付款条件(cod_paym)我想把与之比较的原付款条件也显示出来
    还有总觉得这个sql蛮复杂的,不知道能不能改改优化一下呵呵,请朋友们帮忙了,谢谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gisinfo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 15:44:401楼 得分:0
    可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gisinfo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 15:48:032楼 得分:0
    不过你要说你的业务规则给我们听啊

    就这么个语句好空泛
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 16:04:173楼 得分:0
    謝謝!這個sql是查当月付款條件異常的,判斷的标准是当月的采购单的付款条件与这个月之前最近的日期、同厂商付款条件作比较,如果不同则为异常显示出来,现在的sql可以显示出采购单号,厂商代号,厂商名,付款条件代码,付款条件,现在就是还想在显示出这笔异常资料的这个月之前最近日期的、同厂商的那个付款条件(原付款条件)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BlueskyWide
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-11-17 16:17:524楼 得分:5
    SQL code
    --上月日期部分不用from dual,直接可用 select C.num_buy, C.cod_fact, f.nam_fact, C.cod_paym, D.content from buym c, CODD D, fact f where c.cod_paym <> (select cod_paym from (select A.NUM_BUY, A.COD_FACT, A.COD_PAYM, A.DAT_BUY FROM BUYM A LEFT JOIN (SELECT COD_FACT, MAX(DAT_BUY) DAT_BUY, max(num_buy) num_buy FROM BUYM where dat_buy <= to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') GROUP BY COD_FACT) B ON B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT WHERE B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT and b.num_buy = a.num_buy) t where c.cod_fact = t.cod_fact) and c.dat_buy > to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') and C.cod_paym = d.code and c.cod_fact = f.cod_fact;



    引用楼主 dingjiahappy 的帖子:
    SQL code
    select C.num_buy,C.cod_fact,f.nam_fact,C.cod_paym,D.content
    from buym c,CODD D,fact f
    where c.cod_paym <>
    (select cod_paym from
      (select A.NUM_BUY,A.COD_FACT,A.COD_PAYM,A.DAT_BUY FROM BUYM A LEFT JOIN (SELECT COD_FACT,MAX(DAT_BUY) DAT_BUY,max(num_buy) num_buy FROM BUYM where dat_buy <=(select to_char(last_day(add_months(sysdate, -1)),'yyyyMMdd') from dual)GROUP BY COD_FACT) B ON B.…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linzhangs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 16:34:075楼 得分:0
    楼主。这个是当时你写的用一个临时表让我们给用select语句写的吧。我记得。
    你还不如把表结构发给我们,重新给你写!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 16:40:546楼 得分:0
    buym

    Name Null? Type
    CLS_GET NOT NULL VARCHAR2(1)
    NUM_BUY NOT NULL VARCHAR2(12)
    SER_BUY VARCHAR2(2)
    DAT_BUY VARCHAR2(8)
    COD_FACT VARCHAR2(8)
    NUM_FACT VARCHAR2(20)
    COD_PAYM VARCHAR2(3)
    CLS_DOLLA VARCHAR2(3)
    COD_EMPBUY VARCHAR2(8)
    COD_XFER VARCHAR2(2)
    COD_ADDR VARCHAR2(4)
    ADR_DEL VARCHAR2(200)
    DAT_REQ VARCHAR2(8)
    NAM_ATTN VARCHAR2(30)
    NUM_TEL VARCHAR2(25)
    NUM_FAX VARCHAR2(25)
    AMT_TOT NUMBER(16,4)
    MNY_DSC NUMBER(16,2)
    MNY_TRN NUMBER(16,2)
    MNY_INSU NUMBER(16,2)
    MNY_PROC NUMBER(16,2)
    MNY_OTHS NUMBER(16,2)
    AMT_BUY NUMBER(16,4)
    COD_CONF VARCHAR2(8)
    REMARK VARCHAR2(2000)
    COD_EMPIN VARCHAR2(8)
    COD_EMPCLS VARCHAR2(8)
    DAT_CLOSE VARCHAR2(8)
    COD_BUYC VARCHAR2(2)
    STS_BUY VARCHAR2(2)
    COD_NEED VARCHAR2(8)
    NUM_ORD VARCHAR2(30)
    ROT_ORD VARCHAR2(3)
    SOR_BUY VARCHAR2(1)
    INS_ALL VARCHAR2(1)
    COD_QUT VARCHAR2(3)
    DSC_DELV VARCHAR2(2000)
    NUM_EDSM VARCHAR2(12)
    NUM_EDIR VARCHAR2(10)
    DAT_POR VARCHAR2(8)
    COD_POR VARCHAR2(2)
    DSP_POR VARCHAR2(50)
    DSC_REJ VARCHAR2(100)
    NUM_PS VARCHAR2(12)
    NUM_CNTL VARCHAR2(16)
    TAX_TYPE VARCHAR2(1)
    DAT_CONF VARCHAR2(8)
    SER_PCS VARCHAR2(12)
    SND_FROM VARCHAR2(5)
    SND_TO VARCHAR2(5)
    COD_REQ VARCHAR2(3)
    DAT_KEYIN VARCHAR2(8)
    TIM_KEYIN VARCHAR2(8)
    EMP_LAST VARCHAR2(8)
    DAT_LAST VARCHAR2(8)
    TYP_BUYM VARCHAR2(3)
    REMARK2 VARCHAR2(2000)
    SED_CUST VARCHAR2(8)
    COD_PAYMT VARCHAR2(4)
    DPT_CTL VARCHAR2(8)
    OX_CODBUY VARCHAR2(1)
    OX_AREA VARCHAR2(8)
    OX_PAYDAYS VARCHAR2(10)
    OX_UPDATED_DATE DATE
    OX_OPT_DB_LOC VARCHAR2(30)
    DSC_CLOSE VARCHAR2(100)
    TYP_CLOSE VARCHAR2(2)
    OX_FLOW_FLAG VARCHAR2(1)
    COD_EMP_BUYER VARCHAR2(8)
    F1 VARCHAR2(30)
    F2 VARCHAR2(30)
    F3 VARCHAR2(30)
    COD_EMPSOURCER VARCHAR2(8)
    OX_COD_MULTI VARCHAR2(8)
    LIN_MULTI VARCHAR2(3)
    OX_NUM_MULTI VARCHAR2(50)
    NUM_PO VARCHAR2(16)
    OX_EXEC_MULTI VARCHAR2(1)
    OX_CROSSFAB VARCHAR2(1)
    OX_NUM_CONT VARCHAR2(20)
    OX_NUM_VDBK VARCHAR2(16)
    OX_NUM_CROSS VARCHAR2(20)
    OX_DAT_CROSS VARCHAR2(8)
    OX_SDAT_CROSS VARCHAR2(8)
    OX_NUM_APPLY VARCHAR2(20)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 16:41:427楼 得分:0
    SQL code
    Name Null? Type CODE_ID NOT NULL VARCHAR2(10) CODE NOT NULL VARCHAR2(20) CONTENT VARCHAR2(2000) CVALUE VARCHAR2(100) EDIT_USER VARCHAR2(1) CVALUE2 VARCHAR2(100) CVALUE3 VARCHAR2(20) OX_OPT_DB_LOC VARCHAR2(8) OX_UPDATED_TIME VARCHAR2(6) OX_AREA VARCHAR2(8) NUM_CNTL VARCHAR2(16) DPT_CTL VARCHAR2(8) OX_CODEGRP VARCHAR2(20) OX_UPDATED_DATE DATE OX_CODECLS VARCHAR2(10) OX_DATEND VARCHAR2(8) CVALUE4 VARCHAR2(20) CVALUE5 VARCHAR2(20) CVALUE6 VARCHAR2(20) CVALUE7 VARCHAR2(20) CVALUE8 VARCHAR2(20)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 16:42:058楼 得分:0
    上面是codd
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linzhangs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-17 20:46:409楼 得分:40
    try it
    SQL code
    select t.num_buy, t.cod_fact, f.nam_fact, t.acod_paym, t.bcod_paym, D.content from (select a.cod_paym acod_paym, a.cod_fact, a.num_buy, b.cod_paym bcod_paym, row_number() over(order by(a.dat_buy - b.dat_buy)) rn from buym a, buym b where a.cod_paym <> b.cod_paym and substr(a.dat_buy, 1, 6) = to_char(sysdate, 'yyyymm') and substr(b.dat_buy, 1, 6) = to_char(add_months(sysdate, -1), 'yyyymm')) t, CODD D, fact f where t.cod_paym = d.code and t.cod_fact = f.cod_fact and t.rn = 1;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 11:30:1410楼 得分:0
    引用 9 楼 linzhangs 的回复:
    try it
    SQL code
    select t.num_buy,
          t.cod_fact,
          f.nam_fact,
          t.acod_paym,
          t.bcod_paym,
          D.content
      from (select a.cod_paym acod_paym,
                  a.cod_fact,
                  a.num_buy,
                  b.cod_paym bcod_paym,
                  row_number() over(order by(a.dat_buy - b.dat_buy)) rn
              from buym a, buym b
            where a.cod_paym <> …


    運行后有如下提示
    ORA-00904: "T"."COD_PAYM": invalid identifier
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 12:44:5011楼 得分:0
    成了,不過複雜的相當厲害自己覺得,有誰可以幫忙優化一下的嗎?謝謝了!
    SQL code
    select C.num_buy, C.cod_fact, f.nam_fact, C.cod_paym, D.content , (select t.cod_paym oldpaym from (select A.NUM_BUY, A.COD_FACT, A.COD_PAYM, A.DAT_BUY FROM BUYM A LEFT JOIN (SELECT COD_FACT, MAX(DAT_BUY) DAT_BUY, max(num_buy) num_buy FROM BUYM where dat_buy <= to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') GROUP BY COD_FACT) B ON B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT WHERE B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT and b.num_buy = a.num_buy) t ,buym c ,codd e where c.cod_fact = t.cod_fact and c.dat_buy > to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') and c.cod_paym<>t.cod_paym and t.cod_paym = e.code)oldpaym , (select e.content from (select A.NUM_BUY, A.COD_FACT, A.COD_PAYM, A.DAT_BUY FROM BUYM A LEFT JOIN (SELECT COD_FACT, MAX(DAT_BUY) DAT_BUY, max(num_buy) num_buy FROM BUYM where dat_buy <= to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') GROUP BY COD_FACT) B ON B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT WHERE B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT and b.num_buy = a.num_buy) t ,buym c ,codd e where c.cod_fact = t.cod_fact and c.dat_buy > to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') and c.cod_paym<>t.cod_paym and t.cod_paym = e.code) oldcontent from buym c, CODD D, fact f where c.cod_paym <> (select cod_paym from (select A.NUM_BUY, A.COD_FACT, A.COD_PAYM, A.DAT_BUY FROM BUYM A LEFT JOIN (SELECT COD_FACT, MAX(DAT_BUY) DAT_BUY, max(num_buy) num_buy FROM BUYM where dat_buy <= to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') GROUP BY COD_FACT) B ON B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT WHERE B.DAT_BUY = A.DAT_BUY AND B.COD_FACT = A.COD_FACT and b.num_buy = a.num_buy) t where c.cod_fact = t.cod_fact) and c.dat_buy > to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd') and C.cod_paym = d.code and c.cod_fact = f.cod_fact;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yonghengdizhen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 13:07:0712楼 得分:0
    上面的查询能执行?
    难道
        (select t.cod_paym oldpaym
              from (select A.NUM_BUY, A.COD_FACT, A.COD_PAYM, A.DAT_BUY
                      FROM BUYM A
                      LEFT JOIN (SELECT COD_FACT,
                                      MAX(DAT_BUY) DAT_BUY,
                                      max(num_buy) num_buy
                                  FROM BUYM
                                where dat_buy <=
                                      to_char(last_day(add_months(sysdate, -1)),
                                              'yyyyMMdd')
                                GROUP BY COD_FACT) B ON B.DAT_BUY = A.DAT_BUY
                                                    AND B.COD_FACT = A.COD_FACT
                    WHERE B.DAT_BUY = A.DAT_BUY
                      AND B.COD_FACT = A.COD_FACT
                      and b.num_buy = a.num_buy) t ,buym c ,codd e
            where c.cod_fact = t.cod_fact
            and c.dat_buy > to_char(last_day(add_months(sysdate, -1)), 'yyyyMMdd')
            and c.cod_paym <>t.cod_paym
            and t.cod_paym = e.code)oldpaym ,

    这样的子查询返回单行值?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yonghengdizhen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 13:46:0813楼 得分:0
    即使你应用程序的逻辑保证了上述查询只会有单行值返回,从你描述的逻辑上看来,上面的查询也是有问题的.只不过还没有足够覆盖面的数据量来揭示此问题.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linzhangs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 13:52:2514楼 得分:0
    引用 10 楼 dingjiahappy 的回复:
    引用 9 楼 linzhangs 的回复:
    try it
    SQL code
    select t.num_buy,
    t.cod_fact,
    f.nam_fact,
    t.acod_paym,
    t.bcod_paym,
    D.content
    from (select a.cod_paym acod_paym,
    a.cod_fact,
    a.num_buy,
    b.cod_paym bcod_paym,
    row_number() over(order by(a.dat_buy - b.dat_buy)) rn
    from buym a, buym b
    where a.cod_paym  <> …


    運行后有如下提示
    ORA-00904: "T"."COD_PAYM": invalid identifier

    我是照着你的语句跟你的业务需求写的。你要自己修改下阿。
    你那个拼接起来的太复杂了。
    我给修改了下,有问题再说。关键这没测试数据
    SQL code
    select t.num_buy, t.cod_fact, f.nam_fact, t.cod_paym, t.bcod_paym, D.content from (select a.cod_paym cod_paym, a.cod_fact, a.num_buy, b.cod_paym bcod_paym, row_number() over(order by(a.dat_buy - b.dat_buy)) rn from buym a, buym b where a.cod_paym <> b.cod_paym and substr(a.dat_buy, 1, 6) = to_char(sysdate, 'yyyymm') and substr(b.dat_buy, 1, 6) = to_char(add_months(sysdate, -1), 'yyyymm')) t, CODD D, fact f where t.cod_paym = d.code and t.cod_fact = f.cod_fact and t.rn = 1;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 14:20:4715楼 得分:0
    謝謝樓上的,我把(sysdate, -1)改成(sysdate,-2)后的確出現了你所說的錯誤,請問可以幫忙把這個改一下嗎
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yonghengdizhen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 14:22:4216楼 得分:0
    稍微写了一下
    SELECT
    A.COD_FACT,
    A.DAT_BUY,
    A.NUM_BUY,
    A.COD_PAYM,E.CONTENT,
    B.COD_PAYM,F.CONTENT,
    FROM BUYM A
    JOIN CODD E ON a.COD_PAYM=E.CODE
    LEFT JOIN
    (SELECT COD_FACT,COD_PAYM,
            row_number() over(PARTITION BY COD_FACT ORDER BY DAT_BUY DESC,NUM_BUY DESC) AS recent_paym
      FROM BUYM
      WHERE DAT_BUY <=TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -1)),'yyyyMMdd')
    ) B ON a.COD_FACT=B.COD_FACT AND b.recent_paym=1
    LEFT JOIN CODD F ON B.COD_PAYM=F.CODE
    WHERE a.DAT_BUY>TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -1)),'yyyyMMdd')
      AND (a.COD_PAYM <>b.COD_PAYM OR b.COD_PAYM IS NULL)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Hopewell_Go
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 14:28:0617楼 得分:0
    关注 中。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linzhangs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 14:43:4218楼 得分:0
    引用 15 楼 dingjiahappy 的回复:
    謝謝樓上的,我把(sysdate, -1)改成(sysdate,-2)后的確出現了你所說的錯誤,請問可以幫忙把這個改一下嗎
    是跟我说的吗。什么意思?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 17:27:0019楼 得分:0
    到“FROM BUYM A”ORA-00936: missing expression
    引用 16 楼 yonghengdizhen 的回复:
    稍微写了一下
    SELECT
    A.COD_FACT,
    A.DAT_BUY,
    A.NUM_BUY,
    A.COD_PAYM,E.CONTENT,
    B.COD_PAYM,F.CONTENT,
    FROM BUYM A
    JOIN CODD E ON a.COD_PAYM=E.CODE
    LEFT JOIN
    (SELECT COD_FACT,COD_PAYM,
            row_number() over(PARTITION BY COD_FACT ORDER BY DAT_BUY DESC,NUM_BUY DESC) AS recent_paym
      FROM BUYM
      WHERE DAT_BUY <=TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -1)),'yyyyMMdd')
    ) B ON …
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dingjiahappy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 17:33:2320楼 得分:0
    linzhangs:
      您好,謝謝你的熱情回覆。
      你最後給我的sql可以執行了,但查到的數據有些問題,bcod_paym查到的數據不正確,這個我需要同廠商cod_fact這個月之前最近日期的采購單num_buy中的cod_paym,另外我也需要它對應的content付款條件名稱

      codd是個代碼表,code就是代碼,content就是代碼對應的名稱


      再麻煩大家了,不勝感激!
    修改 删除 举报