2017-09-07 72 views
1

我有一個會計年度的開始日期和結束日期範圍: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] 
+1

類似於'SELECT MAX(PayonDate)FROM TABLE WHERE PayonDate> ='2016-07-01'AND PayonDate <'2017-07-01'' –

+0

感謝Jacob。我在我的子查詢中實際上有這個。 – cmpmd2

+0

PayonDate是什麼數據類型?我們可以在這裏幫助,但我們需要一些細節。這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

回答

0

爲了澄清我先前的評論:(這將是太長,不評論)

我假設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] 
+0

This Works!基本上我有參數日期在不正確的地方,如果這是我的理解爲什麼代碼不按我想要的方式工作。那是對的嗎? – cmpmd2

+0

是的。您需要在確定最大值[付款日期]之前應用日期範圍限制。所以通過確保max只能在您的會計日期範圍內選擇一個日期,那麼max只能是該財務範圍內的日期。限制不能在WHERE子句中,因爲您有ips作爲左連接。因此加入的AND標準。這樣,派生的表格/內聯視圖名爲'SubMax'只會在指定範圍內的日期付款。我不完全理解你在這裏做什麼,所以**在進入生產系統之前,測試一下這個**。 (對於任何答案真正的賢者忠告) – xQbert

+0

也注意我認爲這是@JacobH提到的第一個評論;但他們沒有詳細說明你在哪裏放置它;這是根本問題所在。關於測試評論**確保您測試像'6/30/17 13:15'的payonDatetime這樣的邊緣案例,使用將會排除該記錄;當你想要的時候!**這是肖恩所暗指的一個元素! – xQbert

0

我發現日期維度表是一個神發送,尤其是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 
+0

我創建了一個腳本來創建使用非標準FY開始日期的日期維度。我需要寫博客。 – Shawn

+0

如果保留StartDate和EndDate參數,則日期表沒有意義。 但我可以確認一個日期表是非常有用的。只是一個額外的簡短說明: 它應該包含一個按日期的行,並具有所需的多個屬性(日期本身,星期幾,星期幾,星期幾,星期,財政年度,日期以不同的varchar格式其他數據庫/表)。 –

+1

@RaphaelMüllner當你加入它是有道理的。 ips表會將日期限制爲開始日期和結束日期範圍,然後僅將這些日期加入您關心的FY年。這會使你爲它生成的row_number()成爲你想要的FY中的最大日期再次聲明:我討厭日期.. – Shawn

相關問題