我正在使用两张桌子。第一个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()
成功返回当前季度(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问题。
答案 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;那你应该没事。