2017-02-15 98 views
0

我有兩張我正在使用的桌子。第一個QuarterDateMapping持有約四分之三的開始和結束日期的信息:如何根據另一個查詢的輸出來選擇行?

GregorianQuarterName | GregorianMonthBeginDate | GregorianMonthEndDate 

其中GregorianQuarterNamenvarchar用字符串命名季度格式「FY%Y-答疑q」和GregorianMonthBeginDateGregorianMonthEndDatedatetime對象。第二個表,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問題。

回答

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

這大部分工作,但我需要從'SELECT'語句中刪除'QDM.GregorianQuarterName,QDM.GregorianMonthBeginDate,QDM.GregorianMonthEndDate',以便獲取與篩選表格相同的數據。由於輸出包含3個額外的列,並且每一行上重複出現'QuarterDateMapping'的當前季度的數據。 – Barker

相關問題