2014-12-10 2 views
0

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

Вот упрощенная версия моего запроса:

SELECT qVolTbl.QUEUEID, 
     qVolTbl.Queue_Volume, 
     qVolTbl.CAMPAIGNID, 
     camVolTbl.Campaign_Volume 
FROM (
     SELECT QHISTORY.QUEUEID, 
       SUM(QHISTORY.CALLVOLUME) AS Queue_Volume, 
       QHISTORY.CAMPAIGNID 
     FROM QHISTORY 
     WHERE QHISTORY.DATE BETWEEN CONVERT(DATETIME, '01-NOV-2014') 
           AND CONVERT(DATETIME, '30-NOV-2014') 
     GROUP BY QHISTORY.QUEUEID, 
       QHISTORY.CAMPAIGNID 
     ) qVolTbl 

     LEFT JOIN (
       SELECT SP.CAMPAIGNID, 
         SUM(QHISTORY.CALLVOLUME) as Campaign_Volume 
       FROM QHISTORY 
       WHERE QHISTORY.DATE BETWEEN CONVERT(DATETIME, '01-NOV-2014') 
              AND CONVERT(DATETIME, '30-NOV-2014') 
       GROUP BY SP.CAMPAIGNID 
       ) camVolTbl 
       ON camVolTbl.CAMPAIGNID = qVolTbl.CAMPAIGNID 

Более подробная информация о чем я работаю, если необходимо:

Я запрашивая данные об объеме от иерархии, где " Том »входит в« Очереди », которые сгруппированы в« Кампании ». Я хочу, чтобы результаты, состоящий из общего объема для каждой очереди на той же строке, что и общий объем для кампании очередь принадлежит это нравится:

| QUEUEID | QUEUE_VOLUME | CAMPAIGNID | CAMPAIGN_VOLUME | 
--------------------------------------------------------- 
| 001  | 200   | 001  | 500    | 
| 002  | 300   | 001  | 500    | 
| 003  | 100   | 002  | 350    | 
| 004  | 250   | 002  | 350    | 
+1

Почему бы не объявить переменные даты и не использовать их в обоих запросах – radar

ответ

1

Это, как вы бы построить то, что радар предложил:

DECLARE @startdate DATETIME = '01-NOV-2014',@enddate DATETIME = '30-NOV-2014' 

SELECT qVolTbl.QUEUEID, 
     qVolTbl.Queue_Volume, 
     qVolTbl.CAMPAIGNID, 
     camVolTbl.Campaign_Volume 
FROM (
     SELECT QHISTORY.QUEUEID, 
       SUM(QHISTORY.CALLVOLUME) AS Queue_Volume, 
       QHISTORY.CAMPAIGNID 
     FROM QHISTORY 
     WHERE QHISTORY.DATE BETWEEN @startdate 
           AND @enddate 
     GROUP BY QHISTORY.QUEUEID, 
       QHISTORY.CAMPAIGNID 
     ) qVolTbl 

     LEFT JOIN (
       SELECT SP.CAMPAIGNID, 
         SUM(QHISTORY.CALLVOLUME) as Campaign_Volume 
       FROM QHISTORY 
       WHERE QHISTORY.DATE BETWEEN @startdate 
              AND @enddate 
       GROUP BY SP.CAMPAIGNID 
       ) camVolTbl 
       ON camVolTbl.CAMPAIGNID = qVolTbl.CAMPAIGNID 
+0

Просто честное предупреждение OP, если он/она раньше не использовал даты. Запрос НЕ будет включать записи 30-го числа, поскольку в этот день простая дата - полночь. Если вы хотите включить все время на 30-е, добавьте 1 день в свой конечный диапазон или сравните только части даты. – Jeremy

+0

И к 30-м, вы имеете в виду '@ enddate'. Было бы неплохо включить 23: 59: 59.999 в конец объявления '@ enddate'. –

+0

Да, вот что я имел в виду. добавив, что время там тоже работает. – Jeremy

0

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

Смежные вопросы