Period 002/2011 is not open for account type S and G/L 799999

本文介绍了解决MB1C过程中遇到的过账期间限制问题,通过TCODE:OB52维护了公司1000的过账期间,并将截止年份更新至2011年。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同样是在做MB1C过程中,系统报错如下信息:

运行TCODE:OB52 维护计帐期间,可以看到对应的compan 1000 允许的过账期间是从2008/01 至 2009/12

为了后期练习方便,一次过把1000公司对应的account type都维护了

把截止年份都修改成2011后保存!

 

SELECT a.company_code, a.company_name, a.gl_account_nbr, a.clearing_date, a.clear_account_document_nbr, a.doc_assignment, a.fiscal_year, a.gl_document_nbr, a.document_item_nbr, a.doc_posting_date, a.document_date, a.document_currency, a.doc_reference, a.document_type, a.fiscal_period, a.doc_posting_key, a.doc_account_debit_or_credit, a.business_scope, a.doc_tax_code, a.doc_local_currency_amount, a.doc_currency_amount, a.tax_amount_standard, a.doc_currency_tax, a.doc_item_text, a.doc_source_order_nbr, a.plant_code, a.cost_center, a.doc_payment_starting_date, a.doc_open_item_management, a.doc_value_date, a.bpm_order_no, a.process_code, a.paymethod, a.paystract, a.zshare_ctr, a.cl_document_nbr, a.handling_accountant, a.handling_accountant_name, a.z_proid, a.pernr, a.dr_amount, a.cr_amount, a.paymethod_name, a.gl_account_name, a.anti_accounting_mark, a.enter_time, a.wb_debit_amount, a.wb_crebit_amount, a.ts_ms – a.cnt FROM ( SELECT a_1.company_code, a_1.company_name, a_1.gl_account_nbr, a_1.clearing_date, a_1.clear_account_document_nbr, a_1.doc_assignment, a_1.fiscal_year, a_1.gl_document_nbr, a_1.document_item_nbr, a_1.doc_posting_date, a_1.document_date, a_1.document_currency, a_1.doc_reference, a_1.document_type, a_1.fiscal_period, a_1.doc_posting_key, a_1.doc_account_debit_or_credit, a_1.business_scope, a_1.doc_tax_code, a_1.doc_local_currency_amount, a_1.doc_currency_amount, a_1.tax_amount_standard, a_1.doc_currency_tax, a_1.doc_item_text, a_1.doc_source_order_nbr, a_1.plant_code, a_1.cost_center, a_1.doc_payment_starting_date, a_1.doc_open_item_management, a_1.doc_value_date, a_1.bpm_order_no, head.procode AS process_code, payment.paymethod, a_1.paystract, a_1.zshare_ctr, a_1.cl_document_nbr, CASE WHEN head.pernrjb IS NOT NULL AND head.pernrjb <> ‘’::text THEN head.pernrjb ELSE bkpf.usnam END AS handling_accountant, pa001.sname AS handling_accountant_name, head.proid AS z_proid, head.pernr, a_1.dr_amount, a_1.cr_amount, payment.paymethodtxt AS paymethod_name, a_1.gl_account_name, a_1.anti_accounting_mark, a_1.enter_time, a_1.wb_debit_amount, a_1.wb_crebit_amount, a_1.ts_ms – row_number() OVER (PARTITION BY a_1.company_code, a_1.gl_account_nbr, a_1.fiscal_year, a_1.fiscal_period, a_1.gl_document_nbr, a_1.document_item_nbr ORDER BY head.procode DESC) AS cnt FROM table_01 a_1 LEFT JOIN dwd_ztbpm_payment_view payment ON a_1.bpm_order_no = payment.orderno LEFT JOIN dwd_ztfi_trpay_view trpay ON a_1.bpm_order_no = trpay.orderno LEFT JOIN dwd_bkpf_r bkpf ON bkpf.bukrs = a_1.company_code AND bkpf.gjahr = a_1.fiscal_year AND bkpf.belnr = a_1.gl_document_nbr LEFT JOIN (select orderno,procode,pernrjb,proid,pernr from dwd_ztbpm_post_head_r group by procode,pernrjb,proid,pernr,orderno) head ON a_1.bpm_order_no = head.orderno LEFT JOIN (select pernr,sname from dwd_pa0001_r group by sname,pernr) pa001 ON pa001.pernr = head.pernrjb) a – WHERE a.cnt = 1 where EXISTS ( select *from (select max(procode)procode,bsis.bukrs as bukrs,hkont,gjahr,monat,bsis.belnr,buzei from (select orderno,procode,pernrjb,proid,pernr,reserve2,bukrs,belnr,zyear from dwd_ztbpm_post_head_r group by procode,pernrjb,proid,pernr,orderno,reserve2,bukrs,belnr,zyear)head_1 right JOIN (select bukrs,hkont,gjahr,monat,belnr,buzei,xblnr from dwd_bsis_r)bsis ON btrim(bsis.xblnr) = btrim(head_1.reserve2) AND bsis.bukrs = head_1.bukrs AND bsis.belnr = head_1.belnr AND bsis.gjahr = head_1.zyear group by bsis.bukrs,hkont,gjahr,monat,bsis.belnr,buzei )b – where – a.company_code=b.bukrs and a.gl_account_nbr=b.hkont and a.fiscal_year=b.gjahr and a.fiscal_period=b.monat – and a.gl_document_nbr=b.belnr and a.document_item_nbr=b.buzei ) and company_code=‘3000’ and process_code=‘F115’ 这种写法为什么和用rownumber获得最大值最后得到的数据量不一致 怎样改使用exists才能让数据量一致
最新发布
03-31
<think>嗯,这个问题看起来有点复杂。让我先仔细看看用户提供的SQL查询,然后理解他们的问题所在。用户想知道为什么使用EXISTS子句的写法与使用ROW_NUMBER()获取最大值得到的数据量不一致,以及如何调整EXISTS的写法让数据量一致。 首先,我需要分析这两个方法的逻辑差异。原查询中有两个版本:一个使用了ROW_NUMBER()并过滤cnt=1,另一个使用了EXISTS子查询。用户发现两者的结果数据量不同,需要找出原因并修正EXISTS的写法。 让我先看看ROW_NUMBER()部分。内部子查询a中,ROW_NUMBER()被注释掉了,可能用户之前用过这个方法。ROW_NUMBER()的作用是按特定字段分区并按procode降序排列,取每个分区的第一行。这样做的目的是为了去重,保留每个分区中procode最大的记录。 而EXISTS部分则是检查是否存在满足某些条件的记录。子查询b中,通过max(procode)和group by来获取每个分组中的最大procode,然后与主查询中的字段进行关联。但用户注释掉了连接条件,可能导致EXISTS的条件不够严格,从而包含了更多记录。 接下来,我需要比较两者的关联条件。在ROW_NUMBER()方法中,分区依据是company_code, gl_account_nbr, fiscal_year, fiscal_period, gl_document_nbr, document_item_nbr,按procode降序排列,取第一条。这意味着每个分区的唯一性由这些字段决定,且选的是procode最大的那条记录。 而EXISTS的子查询b中,虽然使用了max(procode),但group by的字段是bukrs, hkont, gjahr, monat, belnr, buzei。主查询中的连接条件被注释掉了,可能没有正确关联到主表的字段,导致EXISTS的条件不准确,可能关联到了更多的记录,或者关联条件缺失导致所有记录都满足EXISTS。 可能的错误点在于,EXISTS子查询中的关联条件被注释掉了,即没有将主表的company_code等字段与子查询中的bukrs等字段连接起来。这样,EXISTS子查询可能返回所有符合条件的记录,而不管主表中的记录是否与之匹配,从而导致数据量不一致。 为了修正这个问题,需要确保EXISTS子查询中的条件正确关联主表和子查询的字段。即取消注释where子句中的连接条件,确保主表的字段与子查询中的字段正确对应,例如a.company_code = b.bukrs,a.gl_account_nbr = b.hkont等。这样,EXISTS只会检查是否存在在相同分组且procode最大的记录,从而与ROW_NUMBER()方法的结果一致。 另外,还需要确保子查询b中的max(procode)与主查询中的procode匹配。可能需要在子查询b中添加条件,使得b.procode等于主查询中的process_code,或者在EXISTS的条件中进一步过滤。但根据当前查询,子查询b已经按分组取了max(procode),所以只要关联条件正确,应该能匹配到正确的记录。 总结一下,问题出在EXISTS子查询中的连接条件被注释掉了,导致关联不准确。解决方法是将这些条件取消注释,确保主表和子查询正确关联,从而使得两种方法的数据量一致。</think>该问题的核心在于两种去重逻辑的筛选维度不同。以下是逐步分析及修改方案: --- ### 一、原始写法差异分析 #### 1. ROW_NUMBER() 方案逻辑 ```sql ROW_NUMBER() OVER ( PARTITION BY a_1.company_code, a_1.gl_account_nbr, a_1.fiscal_year, a_1.fiscal_period, a_1.gl_document_nbr, a_1.document_item_nbr ORDER BY head.procode DESC ) AS cnt WHERE cnt = 1 ``` - **作用**:按 `company_code + gl_account_nbr + fiscal_year + fiscal_period + gl_document_nbr + document_item_nbr` 分组,每组取 `procode` 最大的记录。 - **筛选维度**:**凭证行级别**(精确到 `document_item_nbr`) #### 2. EXISTS 方案逻辑问题 ```sql EXISTS ( SELECT ... GROUP BY bsis.bukrs, hkont, gjahr, monat, bsis.belnr, buzei ) -- 注释掉的关联条件: -- a.company_code=b.bukrs -- AND a.gl_account_nbr=b.hkont -- AND a.fiscal_year=b.gjahr -- AND a.fiscal_period=b.monat -- AND a.gl_document_nbr=b.belnr -- AND a.document_item_nbr=b.buzei ``` - **问题**:`EXISTS` 子查询未关联 `document_item_nbr`,导致筛选维度变为**凭证级别**(仅到 `belnr`) - **结果差异**:若同一凭证(`belnr`)有多个行项目(`buzei`)满足条件,`EXISTS` 会全部保留,而 `ROW_NUMBER()` 会去重。 --- ### 二、修改方案 #### 1. 修正关联条件 **核心目标**:让 `EXISTS` 子查询与 `ROW_NUMBER()` 保持相同的分组维度。 ```sql WHERE EXISTS ( SELECT 1 FROM ( SELECT max(procode) procode, bsis.bukrs, hkont, gjahr, monat, bsis.belnr, buzei -- 关键:保留 buzei 字段 FROM ... GROUP BY bsis.bukrs, hkont, gjahr, monat, bsis.belnr, buzei -- 增加 buzei ) b WHERE a.company_code = b.bukrs AND a.gl_account_nbr = b.hkont AND a.fiscal_year = b.gjahr AND a.fiscal_period = b.monat AND a.gl_document_nbr = b.belnr AND a.document_item_nbr = b.buzei -- 新增行项目关联 ) ``` #### 2. 补充 `procode` 匹配条件 ```sql AND a.process_code = b.procode -- 确保取最大值后与主表匹配 ``` --- ### 三、完整修改后 SQL(关键片段) ```sql WHERE EXISTS ( SELECT 1 FROM ( SELECT max(head_1.procode) as procode, -- 明确取最大值 bsis.bukrs, bsis.hkont, bsis.gjahr, bsis.monat, bsis.belnr, bsis.buzei FROM dwd_ztbpm_post_head_r head_1 RIGHT JOIN dwd_bsis_r bsis ON btrim(bsis.xblnr) = btrim(head_1.reserve2) AND bsis.bukrs = head_1.bukrs AND bsis.belnr = head_1.belnr AND bsis.gjahr = head_1.zyear GROUP BY bsis.bukrs, bsis.hkont, bsis.gjahr, bsis.monat, bsis.belnr, bsis.buzei ) b WHERE a.company_code = b.bukrs AND a.gl_account_nbr = b.hkont AND a.fiscal_year = b.gjahr AND a.fiscal_period = b.monat AND a.gl_document_nbr = b.belnr AND a.document_item_nbr = b.buzei -- 关联到行项目 AND a.process_code = b.procode -- 确保匹配最大值 ) ``` --- ### 四、验证一致性 1. **维度对齐**:确保 `EXISTS` 子查询的分组键包含 `document_item_nbr (buzei)`。 2. **极值匹配**:通过 `max(procode)` 和 `a.process_code = b.procode` 保证取最大值逻辑。 3. **结果对比**:修改后两种方法的数据量应一致。 --- **最终结论**:两者的数据量差异是由于 `EXISTS` 未关联到凭证行项目级别(`buzei`)导致,补充该关联条件后即可对齐逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值