2015-08-27 4 views
1

Мне нужно разделить запросы на выбор, которые я ищу, чтобы объединить в один запрос. Значение Я хотел бы, чтобы мой вывод был отформатирован следующим образом:Переписать в один запрос

col 1 | col2

252 ---- 05

Одна идея состоит в том, чтобы написать КТР и в то время как эти два небольших запросов у меня есть около 4 больше, как это для диапазонов дат, которые я думал, чтобы избежать использования одного или нескольких КТР для получить данные.

Вот мои выберите запросы:

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()  
+0

Это опечатка, или вы действительно выполняете проверку диапазона дат с 'APPD_NEXTINSPDATE' для обоих запросов? – sstan

+0

typo Я просто сделал правильное спасибо –

+0

Обратите внимание, что фильтр на «не является нулевым» не нужен, потому что вы также фильтруете его в том же поле в другом месте. –

ответ

1

Добавить 0 столбец каждого запроса затем sum над union из них:

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

    UNION ALL 

    SELECT 
    0 as pastDueRepl, 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()  
) t 
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 

Детали зависят от ваших требований.

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 для объединения операторов или используйте их как производную таблицу или в ците. Так много вариантов.

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' 

выше может предоставить вам более компактный синтаксис. Однако, если вы полагаетесь на индексы в столбцах даты, то вышеупомянутое может повредить вашу производительность. Убедитесь, что вы просматриваете это, если решите попробовать.