【问题标题】:Multiple sql queries with different where clauses具有不同 where 子句的多个 sql 查询
【发布时间】:2016-06-23 12:29:15
【问题描述】:

我有多个带有不同 where 子句的 sql 查询:

select * from (
  SELECT  ov.state_nm, ov.state_id,us.client_id, us.rebate_qtr_id, 
  sum(cvr.rebate_per_claim) as flagged
  FROM [dOVT_OutlierView].[APP01DBA].[OVT_USER_STATE_ASSIGNMENT] us 
  inner join ovt_states ov on us.state_id=ov.state_id 
  inner join OVT_LABELER_CLIENT_STATE_SETTINGS css 
  on css.client_id=us.client_id and us.state_id=css.state_id
  inner join [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT] cvr 
  on us.client_id= cvr.client_id 
  and css.client_id=cvr.client_id
  inner join [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT_USER_DECISION] udes 
  on udes.client_id=cvr.client_id
  and udes.client_id=css.client_id and us.client_id=udes.client_id
  where us.assigned_to_user_id=81 and us.company_id=50 and us.client_id=23

  group by ov.state_id, us.client_id,ov.state_nm,us.rebate_qtr_id) a
  cross join (

  SELECT  
  sum(cvr.rebate_per_claim) as follwup
  FROM [dOVT_OutlierView].[APP01DBA].[OVT_USER_STATE_ASSIGNMENT] us 
  inner join ovt_states ov on us.state_id=ov.state_id 
  inner join OVT_LABELER_CLIENT_STATE_SETTINGS css 
  on css.client_id=us.client_id and us.state_id=css.state_id
  inner join [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT] cvr 
  on us.client_id= cvr.client_id 
  and css.client_id=cvr.client_id
  inner join [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT_USER_DECISION] udes 
  on udes.client_id=cvr.client_id
  and udes.client_id=css.client_id and us.client_id=udes.client_id
  where us.assigned_to_user_id=81 and us.company_id=50 and us.client_id=23
  and udes.followup_dispute_ignore_flg='F'
  group by ov.state_id, us.client_id,ov.state_nm,us.rebate_qtr_id) b

上述两个括号中的select查询相同,只是第二个查询中添加了where子句。仅出于合并目的,我在两个查询中都添加了交叉连接。

有没有其他方法可以在不重复查询的情况下做到这一点?

【问题讨论】:

  • 可能是公用表表达式(cte)。
  • @jarlh 你能提供例子吗
  • 使用 UNION 代替交叉连接
  • 如果我理解正确,您的两个查询也具有相同的WHERE。唯一的区别是followup_dispute_ignore_flg。由于您没有在第一时间过滤那些!='F',所以您会拥有两次? CROSS JOIN 将提供一个each-with-each...我感觉,这不是您真正想要的...可能值得提供更多背景...

标签: sql sql-server sql-server-2012


【解决方案1】:

我只是把它放在第一个查询的选择部分,删除交叉连接部分,你应该得到你需要的。

sum(case when udes.followup_dispute_ignore_flg='F' then cvr.rebate_per_claim else 0 end )as follwup

所以

select
  ov.state_nm, ov.state_id,
  us.client_id, 
  us.rebate_qtr_id, 
  sum(cvr.rebate_per_claim) as flagged,
  -- just a new line here
  sum(case when udes.followup_dispute_ignore_flg='F' then cvr.rebate_per_claim else 0 end )as follwup
from [dOVT_OutlierView].[APP01DBA].[OVT_USER_STATE_ASSIGNMENT] us 
inner join ovt_states ov on us.state_id=ov.state_id 
inner join OVT_LABELER_CLIENT_STATE_SETTINGS css 
  on css.client_id=us.client_id and us.state_id=css.state_id
inner join [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT] cvr 
  on us.client_id= cvr.client_id and css.client_id=cvr.client_id
inner join [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT_USER_DECISION] udes 
  on udes.client_id=cvr.client_id and udes.client_id=css.client_id and us.client_id=udes.client_id
where us.assigned_to_user_id=81 and us.company_id=50 and us.client_id=23
group by ov.state_id, us.client_id,ov.state_nm,us.rebate_qtr_id

【讨论】:

    【解决方案2】:

    你可以做这样的事情。首先构建您的主查询,并使用您的所有联接。然后以此为基础构建您的摘要查询。然后交叉连接最后的两个汇总查询。

    ;WITH MasterQuery
    AS (
        SELECT ov.state_nm
            ,ov.state_id
            ,us.client_id
            ,us.rebate_qtr_id
            ,cvr.rebate_per_claim
            ,udes.followup_dispute_ignore_flg
        FROM [dOVT_OutlierView].[APP01DBA].[OVT_USER_STATE_ASSIGNMENT] us
        INNER JOIN ovt_states ov
            ON us.state_id = ov.state_id
        INNER JOIN OVT_LABELER_CLIENT_STATE_SETTINGS css
            ON css.client_id = us.client_id
                AND us.state_id = css.state_id
        INNER JOIN [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT] cvr
            ON us.client_id = cvr.client_id
                AND css.client_id = cvr.client_id
        INNER JOIN [APP01DBA].[OVT_CLAIM_VALIDATION_ALL_RESULT_USER_DECISION] udes
            ON udes.client_id = cvr.client_id
                AND udes.client_id = css.client_id
                AND us.client_id = udes.client_id
        WHERE us.assigned_to_user_id = 81
            AND us.company_id = 50
            AND us.client_id = 23
        )
        ,FirstSummaryQuery
    AS (
        SELECT state_nm
            ,state_id
            ,client_id
            ,rebate_qtr_id
            ,sum(cvr.rebate_per_claim) AS flagged
        FROM MasterQuery
        GROUP BY state_nm
            ,state_id
            ,client_id
            ,rebate_qtr_id
        )
        ,SeconndSummaryQuery
    AS (
        SELECT sum(rebate_per_claim) AS follwup
        FROM MasterQuery
        WHERE followup_dispute_ignore_flg = 'F'
        )
    SELECT state_nm
        ,state_id
        ,client_id
        ,rebate_qtr_id
        ,follwup
    FROM FirstSummaryQuery
    CROSS JOIN SeconndSummaryQuery
    

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多