具有不同where子句的多个sql查询

时间:2016-06-23 12:29:15

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

我有多个带有不同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

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

有没有其他方法可以在不重复查询的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你可以这样做。首先使用所有连接构建主查询。然后构建您的摘要查询。然后在最后交叉加入两个摘要查询。

;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