如何根据另一个查询的输出选择行?

时间:2017-02-15 22:35:08

标签: sql sql-server subset

我正在使用两张桌子。第一个QuarterDateMapping包含有关季度开始和结束日期的信息:

GregorianQuarterName | GregorianMonthBeginDate | GregorianMonthEndDate

其中GregorianQuarterNamenvarchar,其中的字符串以格式" FY%y-Q%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()

成功返回当前季度(2017财年至第一季度)。我遇到的困难是试图弄清楚如何使用此输出来查询第二个表。我试过了:

;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

     

多部分标识符&#34; QuarterData.most_recent_quarter&#34;无法受约束。

当我运行与上面相同的查询时,但是四分之一硬编码:

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

它按预期运行并返回我想要的数据,但我希望我的查询能够自动更新。

感谢您的帮助。如果我的问题需要更多信息或更好的格式化,请告诉我,这是我在SO上的第一个SQL问题。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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()

另一方面,我不会在其间使用&lt; =和&gt; =。当你将它与GETUTCDATE()进行比较时,这不应该是一个问题,但是设置日期你有可能重叠。我使用了&gt; =和&lt;但只要只有一个包括&#34; =&#34;那你应该没事。