SQL内部联接和筛选结果

SQL内部联接和筛选结果,sql,database,Sql,Database,我正在查询一个报告,我需要帮助处理几个星期来一直在努力实现的内部连接。这是一个更大的报告查询的一部分,但在最后一部分我需要帮助taht应该过滤某些结果 cwo_工作单_行_项目中的每一行表示特定工作单上按交易顺序分组的项目。此查询正在将此表和另一个表合并为报表,cat\u cust\u item\u acct\u activity。该表显示了处理某个帐户的不同交易 报告的这个特定部分应该只显示作为“估算”收费的项目。在项目被更改为与设置时不同的交易的实际价格之前,此查询工作得非常好 问题在于,表

我正在查询一个报告,我需要帮助处理几个星期来一直在努力实现的内部连接。这是一个更大的报告查询的一部分,但在最后一部分我需要帮助taht应该过滤某些结果

cwo_工作单_行_项目
中的每一行表示特定工作单上按交易顺序分组的项目。此查询正在将此表和另一个表合并为报表,
cat\u cust\u item\u acct\u activity
。该表显示了处理某个帐户的不同交易

报告的这个特定部分应该只显示作为“估算”收费的项目。在项目被更改为与设置时不同的交易的实际价格之前,此查询工作得非常好

问题在于,表
cwo\u work\u order\u line\u item
以不同的交易顺序(trans\u seq列)插入一个新项目,而
cat\u cust\u item\u acct\u activity
也会获得一个新项目。这样做并不是实际修改每个表中表示项的原始行

这意味着,即使价格从估算更改为实际价格,报告仍在报告上显示原始项目(设置项目)

这是我数据库中两个表的图片。看到这一点将帮助我更好地解释这个问题

在图中的示例中,第一个表是
cwo\u work\u order\u line\u item
。交易顺序1052833是项目设置时的交易。查询仅检查这些项目是否设置为“实际”价格而不是“估计”价格,这在“价格”列中表示

第三行显示一个不同的交易1052834,客户将商品价格更改为实际价格,因此为“实际”

在第二个表中,
cat\u cust\u item\u acct\u activity
,您可以看到客户完成的操作。看起来唯一连接第一个表和第二个表中的项目的是第一个表中的
rtrans\u lineitm\u seq
,第二个表中的
cust\u item\u acct\u detail\u item\u nbr

这就是我认为我需要做的: 我需要进行此查询以检查第二个表,查看
项目会计活动\u code
中是否存在“修改价格”,然后检索该行的
客户项目会计明细\u项目\u nbr
。然后确保第一个表中的行未在
cust\u item\u acct\u detail\u item\u nbr
与第一个表中的
rtrans\u lineitm\u seq
相等的位置联接

原始查询: 如果价格\状态\枚举在设置时未更改或在同一事务中未更改,则此查询有效

SELECT
   DISTINCT(ca.cust_acct_id)                 
FROM
   cwo_work_order_acct ca              
INNER JOIN
   cat_cust_item_acct_activity acty                
      ON                      ca.organization_id = acty.organization_id                     
      AND ca.cust_acct_id = acty.cust_acct_id                     
      AND ca.cust_acct_code = acty.cust_acct_code              
INNER JOIN
   cwo_work_order_line_item cli                         
      ON                          acty.organization_id = cli.organization_id                         
      AND acty.wkstn_id = cli.wkstn_id                         
      AND acty.trans_seq = cli.trans_seq                         
      AND acty.business_date = cli.business_date                         
      AND acty.rtl_loc_id = cli.rtl_loc_id                         
      AND acty.rtrans_lineitm_seq = cli.rtrans_lineitm_seq              
      AND cli.price_status_enum ='ESTIMATE

尝试使用子选择以获取最新的序列号,如下所示:

SELECT DISTINCT(ca.cust_acct_id)                 
FROM cwo_work_order_acct ca              
INNER JOIN
(
SELECT 
    act.organization_id,
    act.wkstn_id,
    act.business_date,
    act.rtl_loc_id,
    act.rtrans_lineitm_seq,
    max(act.trans_seq) trans_seq --Get the most recent seq number
  FROM cat_cust_item_acct_activity act                
  GROUP BY
        act.organization_id,
        act.wkstn_id,
        act.business_date,
        act.rtl_loc_id,
        act.rtrans_lineitm_seq        
  ) as acty
  ON  ca.organization_id = acty.organization_id                     
  AND ca.cust_acct_id = acty.cust_acct_id                     
  AND ca.cust_acct_code = acty.cust_acct_code

INNER JOIN cwo_work_order_line_item cli                         
  ON  acty.organization_id = cli.organization_id                         
  AND acty.wkstn_id = cli.wkstn_id                         
  AND acty.trans_seq = cli.trans_seq                         
  AND acty.business_date = cli.business_date                         
  AND acty.rtl_loc_id = cli.rtl_loc_id                         
  AND acty.rtrans_lineitm_seq = cli.rtrans_lineitm_seq              
  AND cli.price_status_enum ='ESTIMATE'