2016-11-28 62 views
0

我在嘗試解決如何根據日期和另一列生成運行總計時遇到問題。SQL Server按日期和另一列運行總計

我可以在一張簡單的桌子上使用總和來創建一個運行總數,但是在這種情況下,按照日期進行連接並且按照日期進行總運行超出了我的能力。

這些都在Azure(版本12)上的SQL Server數據庫中。

源數據表如下所示:

Existing tables

REFERENCEDATA_DATES是日期覆蓋所有條目日期和月份日期的相應端部的表。它可以與Entry_DateERP_GLDATA

Date and EOM are date type columns。

ERP_JOBHEADERS是系統中所有工作和相關公司編號的列表。本表中的Job_Number可以加入Job_No。在ERP_GLDATA表中。

Company_No. and Job_Number are VARCAR(MAX) type columns。

ERP_GLDATA是參賽資料。應該指出的是,每項工作並不一定在每個日期,甚至每個月都有條目,或者根本沒有條目。 Entry_DateDate數據類型和Account_No. & Job_No.VARCAR(MAX)TotalBaseDecimal類型。

所需的輸出如下所示:

enter image description here

有效輸出應當產生的運行總數中的條目的每個作業直到幷包括在REFERENCEDATA_DATES表月日結束。該示例還顯示,即使該作業當月沒有實際條目,它仍應返回一個數字。希望圖像能夠讓事情變得清晰。

唯一的其他問題是ERP_GLDATA表需要過濾,因此只有Account_No. = 10000

任何人都可以指向正確的方向(假設這甚至可能在SQL中)?

非常感謝提前。

在這種情況下查詢的效率不是問題(只要它運行,我想!)。

回答

0

這是一個示例查詢。您可以更改作業的基準日期和基準值。實際上,基準日期是參考日期表中的第一個日期。

SELECT jh.Company_No, 
     jh.Job_number, 
     rd.EOM, 
     Sum(totalbase) 
    FROM [dbo].[ERP_JOBHEADERS] jh 
    cross apply (select [Entry_date] 
        , TotalBase 
        ,[Job_no] from [dbo].[ERP_GLDATA] where jh.Job_number=Job_no 
       Union 
       Select 
        '2016-01-01' -- base date 
        , 0   -- base value 
        ,Job_number from [dbo].[ERP_JOBHEADERS] where jh.Job_number=Job_number 
        ) gl 
    left join [dbo].[REFERENCEDATA_DATES] rd on rd.[date]>=gl.Entry_date 
group by jh.Company_No, 
     jh.Job_number, 
     rd.EOM 
0

這裏是過濾器上account_no上查詢:

SELECT jh.Company_No, 
     jh.Job_number, 
     rd.EOM, 
     Sum(totalbase) 
FROM [dbo].[ERP_JOBHEADERS] jh 
cross apply (select [Entry_date] 
        , TotalBase 
        , Account_No 
        ,[Job_no] 
        from [dbo].[ERP_GLDATA] 
        where jh.Job_number=Job_no 
       Union 
       Select 
        (select top 1 [date] from [dbo].[REFERENCEDATA_DATES] order by [date] asc) -- base date 
        , 0   -- base value 
        , AcctNo.AccountNo 
        ,Job_number 
        from [dbo].[ERP_JOBHEADERS] erp_jh 
         outer apply (select top 1 ISNULL(Account_No,0) as AccountNo 
                 from [dbo].[ERP_GLDATA] 
                 where Job_no=erp_jh.Job_number) AcctNo 

        where jh.Job_number=Job_number 
        ) gl 
    left join [dbo].[REFERENCEDATA_DATES] rd on rd.[date]>=gl.Entry_date 

where Account_No=10000 

group by jh.Company_No, 
     jh.Job_number, 
     rd.EOM