2017-02-15 42 views
0

У меня есть две таблицы, с которыми я работаю. Первый один QuarterDateMapping содержит информацию о датах начала и окончания кварталов:Как выбрать строки на основе вывода другого запроса?

GregorianQuarterName | GregorianMonthBeginDate | GregorianMonthEndDate 

где GregorianQuarterName представляет собой nvarchar со строкой имен квартал в формате «FY% y- Q% Q» и GregorianMonthBeginDate и GregorianMonthEndDate будучи datetime объектов. Вторая таблица, QuarterlyRevenueData, содержит информации требуется запрашивать и имеет следующий формат:

Fiscal_Quarter | Product | Revenue 

где Fiscal_Quarter имеет тот же формат, как GregorianQuarterName. Я хочу только возвращать значения из второй таблицы, которые находятся на или до текущего квартала. Я понял, как вернуть текущую четверть из первой таблицы с помощью:

SELECT QDMap.GregorianQuarterName AS most_recent_quarter 
FROM QuarterDateMapping QDMap 
WHERE QDMap.GregorianMonthBeginDate <= GetDate() 
AND QDMap.GregorianMonthEndDate >= GetDate() 

успешно возвращает текущий квартал (FY17-Q1). Трудность, с которой я сталкиваюсь, заключается в попытке выяснить, как использовать этот вывод для запроса второй таблицы. Я пробовал:

;WITH QuarterData As 
(
SELECT QDMap.GregorianQuarterName AS most_recent_quarter 
FROM QuarterDateMapping QDMap 
WHERE QDMap.GregorianMonthBeginDate <= GetDate() 
AND QDMap.GregorianMonthEndDate >= GetDate() 
) 
SELECT * FROM QuarterlyRevenueData revdata 
WHERE revdata.Fiscal_Quarter <= QuarterData.most_recent_quarter 

Однако это дает мне ошибку:

Msg 4104, Level 16, State 1, Line 9

The multi-part identifier "QuarterData.most_recent_quarter" could not be bound.

Когда я запускаю тот же запрос, как указано выше, но с квартале жестко закодированного:

SELECT * FROM QuarterlyRevenueData revdata 
WHERE revdata.Fiscal_Quarter <= 'FY17-Q1' 

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

Благодарим за любую помощь. Дайте мне знать, если мой вопрос нуждается в дополнительной информации или улучшенном форматировании, это мой первый SQL-запрос на SO.

ответ

1

Невозможно связать ошибку, потому что, хотя вы создаете набор данных (QuarterData), вы никогда не ссылались на него (соответственно) в конечном запросе ... Изменен ваш код, возвратив значение из CTE в подзапрос, который должен дать вам результат, который вы ищете!

WITH QuarterData As 
(
    SELECT QDMap.GregorianQuarterName AS most_recent_quarter 
    FROM QuarterDateMapping QDMap 
    WHERE QDMap.GregorianMonthBeginDate <= GetDate() 
    AND QDMap.GregorianMonthEndDate >= GetDate() 
) 
SELECT * FROM QuarterlyRevenueData revdata 
WHERE revdata.Fiscal_Quarter <= (SELECT most_recent_quarter FROM QuarterData) 
0

Вы также можете сделать это как соединение вместо подзапроса.

SELECT 
    QDM.GregorianQuarterName 
    ,QDM.GregorianMonthBeginDate 
    ,QDM.GregorianMonthEndDate 
    ,QRD.Fiscal_Quarter 
    ,QRD.Product 
    ,QRD.Revenue 
FROM QuarterDateMapping QDM 
JOIN QuarterlyRevenueData QRD 
    ON QRD.Fiscal_Quarter <= QDM.GregorianQuarterName 
WHERE QDM.GregorianMonthEndDate >= GETUTCDATE() 
    AND QDM.GregorianMonthBeginDate < GETUTCDATE() 

На стороне записки, я бы не использовать < = и> = для между ними. Поскольку вы сравниваете его с GETUTCDATE(), это не должно быть проблемой, но с установленными датами у вас есть возможность перекрытия. Я использовал> = и <, но до тех пор, пока только один включает «=», тогда все должно быть в порядке.

+0

Это в основном работает, но мне нужно удалить 'QDM.GregorianQuarterName, QDM.GregorianMonthBeginDate, QDM.GregorianMonthEndDate,' из оператора SELECT', чтобы получить тот же самый вывод данных, что и фильтрация таблицы. Как и вывод, три дополнительных столбца с данными для текущего квартала от 'QuarterDateMapping' повторяются снова и снова в каждой строке. – Barker