重写为单个查询

时间:2015-08-27 18:57:50

标签: sql sql-server-2012 subquery correlated-subquery

我必须将我希望合并到一个查询中的选择查询分开。意思是我喜欢我的输出格式为:

col 1 | COL2

252 ---- 05

一个想法是编写一个CTE,虽然这两个是小查询,但我还有大约4个这样的日期范围我认为避免使用一个或多个CTES来获取数据。

以下是我的选择查询:

SELECT 
  count(*) as pastDueRepl   
FROM TBLPTS_APPDATA 
WHERE APPV_PTSSTATUS = '2'      
  AND (APPD_NEXTREPLDATE IS NOT NULL)   
  AND APPD_NEXTREPLDATE between DATEADD(Day,-30,GETDATE()) and GETDATE()

SELECT 
  count(*) as pastDueInsp   
FROM TBLPTS_APPDATA 
WHERE APPV_PTSSTATUS = '2'      
  AND (APPD_NEXTINSPDATE IS NOT NULL) 
  AND APPD_NEXTINSPDATE between DATEADD(Day,-30,GETDATE()) and GETDATE()    

4 个答案:

答案 0 :(得分:1)

为每个查询添加cellForRowAtIndexPath列,然后0添加sum列:

union

答案 1 :(得分:0)

这应该让你开始:

select case when APPD_NEXTREPLDATE is not null and APPD_NEXTINSPDATE is null then 'a'
when APPD_NEXTREPLDATE is null and APPD_NEXTINSPDATE is not null then 'b'
when APPD_NEXTREPLDATE is not null and APPD_NEXTINSPDATE is not null then 'c'
else 'd' end status
, count(*) records

from etc
where etc

group by case when APPD_NEXTREPLDATE is not null and APPD_NEXTINSPDATE is null then 'a'
when APPD_NEXTREPLDATE is null and APPD_NEXTINSPDATE is not null then 'b'
when APPD_NEXTREPLDATE is not null and APPD_NEXTINSPDATE is not null then 'c'
else 'd' end

详细信息取决于您的要求。

答案 2 :(得分:0)

我会使用条件聚合并使用聚合函数内部的不同条件,因此对于匹配条件1的每一行都会添加到总和(用作计数):

SELECT 
    SUM(
       CASE 
        WHEN APPD_NEXTINSPDATE between DATEADD(Day,-30,GETDATE()) and GETDATE() 
          THEN 1 
         ELSE 0 
       END
    ) AS pastDueInsp,
    SUM(
       CASE 
        WHEN APPD_NEXTREPLDATE between DATEADD(Day,-30,GETDATE()) and GETDATE() 
          THEN 1 
        ELSE 0 
       END
    ) AS pastDueRepl   
FROM TBLPTS_APPDATA 
WHERE APPV_PTSSTATUS = '2';

或者您可以使用union all运算符来合并语句,或者将每个语句用作派生表或cte。这么多选择。

答案 3 :(得分:0)

这可以是最小化重复次数并减少硬编码日期范围边界的次数的好方法:

  with DateRangeBoundaries as (select DATEADD(Day,-30,GETDATE()) as LowerBoundDate,
                                      GETDATE() as UpperBoundDate)
select count(case when t.APPD_NEXTREPLDATE between drb.LowerBoundDate and drb.UpperBoundDate
                  then 'X' end) as pastDueRepl,
       count(case when t.APPD_NEXTINSPDATE between drb.LowerBoundDate and drb.UpperBoundDate
                  then 'X' end) as pastDueInsp
  from TBLPTS_APPDATA t
  join DateRangeBoundaries drb on 1=1
 where t.APPV_PTSSTATUS = '2'

以上可能会为您提供更紧凑的语法。但是,如果您依赖于日期列上的索引,那么上述内容实际上可能会损害您的性能。如果您决定尝试,请确保对此进行分析。