T-SQL查询只开始日期和结束日期之间的发票
我有一个会计年度的开始日期和结束日期范围:16年7月1日 - 包括我的查询17年6月30日T-SQL查询只开始日期和结束日期之间的发票
日期字段是可以在6/30/17之外的日期付款。
例子:
Company PayonDate
Bose 9/30/17 <---Outside the 6/30/17 date range and will not show on report. This date will pay in advance.
我想显示的日期范围内的最后支付日期:
例子:
Company PayonDate
Bose 4/1/17 <----Actual paid on date vs. pay on date in the future within the date range.
有没有办法做到这一点?
在此先感谢!
更新:
SELECT
ven.VendorID,
ven.Name AS [Vendor Name],
inv.ReferenceNumber AS [Ref. No],
inv.InvoiceNumber AS [Invoice No],
inv.Payment AS Payment,
SubMax.[Pay On Date]
FROM inv
INNER JOIN
(
SELECT MAX(ips.PayOnDateTime) AS [Pay On Date], VendorID
from inv
LEFT JOIN ips ON ips.SourceID = inv.SourceID AND ips.InvoiceID = inv.InvoiceID
Group by VendorID
) SubMax
on inv.VendorID = SubMax.VendorID
INNER JOIN ven ON inv.SourceID = ven.SourceID AND inv.VendorID = ven.VendorID
LEFT JOIN ips ON ips.SourceID = inv.SourceID AND ips.InvoiceID = inv.InvoiceID
WHERE FacilityID = 'HMC'
AND SubMax.[Pay On Date] BETWEEN @StartDate AND @EndDate
AND inv.ReferenceNumber LIKE '__-____'
ORDER BY ven.Name, SubMax.[Pay On Date]
为了澄清我先前的评论:(这将是太长,不评论)
我假设IPS表包含每VENDORID日期多条支付。 因此,我们只能限制我们考虑的最大日期与期望范围内的日期?
也许我还没有完全理解这个问题。
SELECT ven.VendorID
, ven.Name AS [Vendor Name]
, inv.ReferenceNumber AS [Ref. No]
, inv.InvoiceNumber AS [Invoice No]
, inv.Payment AS Payment
, SubMax.[Pay On Date]
FROM inv
INNER JOIN (SELECT MAX(ips.PayOnDateTime) AS [Pay On Date]
, VendorID
FROM inv
LEFT JOIN ips
ON ips.SourceID = inv.SourceID
AND ips.InvoiceID = inv.InvoiceID
-- Can we put it here? so that max can only be payondates in your fiscal year?
AND ips.PayOnDateTime BETWEEN @StartDate AND @EndDate
GROUP BY VendorID) SubMax
ON inv.VendorID = SubMax.VendorID
INNER JOIN ven
ON inv.SourceID = ven.SourceID
AND inv.VendorID = ven.VendorID
LEFT JOIN ips
ON ips.SourceID = inv.SourceID
AND ips.InvoiceID = inv.InvoiceID
WHERE FacilityID = 'HMC'
--WHY HERE
--AND SubMax.[Pay On Date] BETWEEN @StartDate AND @EndDate
AND inv.ReferenceNumber LIKE '__-____'
ORDER BY ven.Name
, SubMax.[Pay On Date]
This Works!基本上我有参数日期在不正确的地方,如果这是我的理解为什么代码不按我想要的方式工作。那是对的吗? – cmpmd2
是的。您需要在确定最大值[付款日期]之前应用日期范围限制。所以通过确保max只能在您的会计日期范围内选择一个日期,那么max只能是该财务范围内的日期。限制不能在WHERE子句中,因为您有ips作为左连接。因此加入的AND标准。这样,派生的表格/内联视图名为'SubMax'只会在指定范围内的日期付款。我不完全理解你在这里做什么,所以**在进入生产系统之前,测试一下这个**。 (对于任何答案真正的贤者忠告) – xQbert
也注意我认为这是@JacobH提到的第一个评论;但他们没有详细说明你在哪里放置它;这是根本问题所在。关于测试评论**确保您测试像'6/30/17 13:15'的payonDatetime这样的边缘案例,使用将会排除该记录;当你想要的时候!**这是肖恩所暗指的一个元素! – xQbert
我发现日期维度表是一个神发送,尤其是FY季度不开始一月1.他们增加一个额外的表加入的问题时,但他们节省了大量的处理和思考。对于一个不错的日期模糊表,请参阅Aaron Bertrand的示例 - https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/。用你认为你需要的东西来定制;我制作了几个不同的版本,有时以此为基础开始。但请记住,目标是创建一次,并在需要时使用它。
在上面的示例中,构建一个日期表,其中列出了大量日期的所有日期,并包含会计年度。然后,简单地在日期表中加入日期表,您需要引用该年的日期。
窗口函数也派上用场。这可能是这样的:
SELECT *
FROM (
SELECT
ven.VendorID
, ven.Name AS [Vendor Name]
, inv.ReferenceNumber AS [Ref. No]
, inv.InvoiceNumber AS [Invoice No]
, inv.Payment AS Payment
, ips.PayOnDateTime AS [Pay On Date]
, d.theFYYear
, ROW_NUMBER() OVER (PARTITION BY inv.InvoiceNumber ORDER BY ips.payOnDateTime DESC) AS rn
FROM ven
INNER JOIN inv ON ven.vendorID = inv.vendorID
AND inv.FacilityID = 'HMC'
AND inv.ReferenceNumber LIKE '__-____'
INNER JOIN ips ON ips.SourceID = inv.SourceID
AND ips.InvoiceID = inv.InvoiceID
AND ips.PayOnDateTime >= @StartDate
AND ips.PayOnDateTime <= @EndDate
INNER JOIN ref_DateDimension d ON ips.PayOnDateTime = d.theDate
AND d.theFYYear = 'FY2017' -- Or whatever FY you need current
) s1
WHERE s1.rn = 1
我创建了一个脚本来创建使用非标准FY开始日期的日期维度。我需要写博客。 – Shawn
如果保留StartDate和EndDate参数,则日期表没有意义。 但我可以确认一个日期表是非常有用的。只是一个额外的简短说明: 它应该包含一个按日期的行,并具有所需的多个属性(日期本身,星期几,星期几,星期几,星期,财政年度,日期以不同的varchar格式其他数据库/表)。 –
@RaphaelMüllner当你加入它是有道理的。 ips表会将日期限制为开始日期和结束日期范围,然后仅将这些日期加入您关心的FY年。这会使你为它生成的row_number()成为你想要的FY中的最大日期再次声明:我讨厌日期.. – Shawn
类似于'SELECT MAX(PayonDate)FROM TABLE WHERE PayonDate> ='2016-07-01'AND PayonDate
感谢Jacob。我在我的子查询中实际上有这个。 – cmpmd2
PayonDate是什么数据类型?我们可以在这里帮助,但我们需要一些细节。这里是一个开始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –