【问题标题】:How to combine these two SQL statements?如何组合这两条 SQL 语句?
【发布时间】:2012-12-31 04:53:16
【问题描述】:

我有 2 个 SQL 查询,它们都获取不同 ID 的计数。

select @cntCM_CMQ = count(*)
from dbo.CaseWorkflow cw 
join vew_CasePersonnelSystemIDs vcps on cw.ID_Case = vcps.ID_Case
join dbo.WorkflowStates ws on ws.ID_WorkflowState = cw.ID_WorkflowState
where CMSUID = @nSUID and ws.ID_WorkflowType = 3    -- CMQ

select @cntCM_PRWK = count(*)
from dbo.CaseWorkflow cw 
join vew_CasePersonnelSystemIDs vcps on cw.ID_Case = vcps.ID_Case
join dbo.WorkflowStates ws on ws.ID_WorkflowState = cw.ID_WorkflowState
where CMSUID = @nSUID and ws.ID_WorkflowType = 1    -- PAPERWORK

似乎我应该能够将它们组合成一个选择(也许使用CASE 语句),但我似乎无法破解它。

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    这样的?

    select sum(case when ws.ID_WorkflowType = 1 then 1 else 0 end) as cntCM_PRWK
         , sum(case when ws.ID_WorkflowType = 3 then 1 else 0 end) as cntCM_CMQ
    from dbo.CaseWorkflow cw 
    join vew_CasePersonnelSystemIDs vcps on cw.ID_Case = vcps.ID_Case
    join dbo.WorkflowStates ws on ws.ID_WorkflowState = cw.ID_WorkflowState
    where CMSUID = @nSUID
    

    【讨论】:

      【解决方案2】:
      select 
      SUM(Cast(Case when ws.ID_WorkflowType = 3 then 1 else 0 end as int) as CMQ
      ,SUM(Cast(Case when ws.ID_WorkflowType = 1 then 1 else 0 end as int) as Paperwork
      
      from dbo.CaseWorkflow cw 
      join vew_CasePersonnelSystemIDs vcps on cw.ID_Case = vcps.ID_Case
      join dbo.WorkflowStates ws on ws.ID_WorkflowState = cw.ID_WorkflowState
      where CMSUID = @nSUID 
      

      【讨论】:

        【解决方案3】:

        这样做有一个技巧。本质上,您使用Case 为您感兴趣的行选择一个1 值,然后使用Sum 来获得计数。如果没有匹配的大小写,则大小写默认为 nullSum 会忽略它

        Select
          @cntCM_CMQ = Sum(Case ws.ID_WorkflowType When 3 Then 1 End),
          @cntCM_PRWK = Sum(Case ws.ID_WorkflowType When 1 Then 1 End) 
        From
          dbo.CaseWorkflow cw 
            inner join 
          vew_CasePersonnelSystemIDs vcps 
            on cw.ID_Case = vcps.ID_Case
            inner join 
          dbo.WorkflowStates ws 
            on ws.ID_WorkflowState = cw.ID_WorkflowState
        Where
          CMSUID = @nSUID
        

        【讨论】:

          【解决方案4】:
          select 
              @cntCM_CMQ = count(case when ws.ID_WorkflowType = 3 then ws.ID_WorkflowType end)
              , @cntCM_PRWK = count(case when ws.ID_WorkflowType = 1 then ws.ID_WorkflowType end)
          from 
              dbo.CaseWorkflow cw 
              join vew_CasePersonnelSystemIDs vcps on cw.ID_Case = vcps.ID_Case
              join dbo.WorkflowStates ws on ws.ID_WorkflowState = cw.ID_WorkflowState
          where 
              CMSUID = @nSUID 
              and ws.ID_WorkflowType in (1, 3)
          

          【讨论】:

            【解决方案5】:

            与其他帖子类似的替代方案。

            Bob Duells 的帖子可能是最具可读性的。

            SELECT 
                [cntCM_PRWK]    = COUNT(CASE WHEN ws.ID_WorkflowType = 1 THEN ws.ID_WorkflowState ELSE NULL END),
                [cntCM_CMQ]     = COUNT(CASE WHEN ws.ID_WorkflowType = 3 THEN ws.ID_WorkflowState ELSE NULL END)
            FROM 
                dbo.CaseWorkflow cw 
                INNER JOIN vew_CasePersonnelSystemIDs vcps 
                        ON cw.ID_Case = vcps.ID_Case
                INNER JOIN dbo.WorkflowStates ws 
                        ON ws.ID_WorkflowState = cw.ID_WorkflowState
            WHERE CMSUID = @nSUID
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-14
              • 2021-03-15
              • 1970-01-01
              • 2023-03-14
              • 2013-02-24
              相关资源
              最近更新 更多