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

问题描述:

我有两张我正在使用的桌子。第一个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问题。

无法绑定错误正在发生,因为尽管您创建了一个数据集(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) 

你也可以做为联接而不是子查询。

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