2016-11-28 19 views
0

日付と別の列による実行中の合計を生成する方法を試すのに問題があります。SQL Serverの日付と別の列の合計の実行

単純なテーブルで合計を使用して合計を作成することができますが、この場合はジョインを実行して、実行する合計を日付で計算することは私の正直な能力を超えています。

これは、すべてAzure(バージョン12)上のSQL Serverデータベースにあります。次のように

ソース・データ・テーブルは、次のとおり

Existing tables

REFERENCEDATA_DATESエントリの日付と月の日付の対応する端部の全てをカバーする日付の表です。 Entry_DateERP_GLDATAで結合することができます。

DateおよびEOMは、dateタイプの列である。

ERP_JOBHEADERSは、システム内のすべてのジョブと関連する企業番号のリストです。この表のJob_NumberJob_Noと結合できます。 ERP_GLDATAテーブルにあります。

Company_No.およびJob_Numberは、VARCAR(MAX)タイプの列である。

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 
関連する問題