SQL Server按日期和另一列

时间:2016-11-28 19:00:43

标签: sql-server

我在尝试按日期和另一列生成运行总计时遇到问题。

我可以在一个简单的表上使用sum来创建一个运行总计,但在这种情况下,执行连接并按日期执行运行总计超出了我的诚实能力。

这一切都在Azure上的SQL Server数据库中(版本12)。

源数据表如下:

Existing tables

REFERENCEDATA_DATES是一个日期表,涵盖所有输入日期和相应的月​​末日期。它可以与Entry_Date中的ERP_GLDATA结合使用。

DateEOMdate类型列。

ERP_JOBHEADERS是系统中所有作业的列表以及相关的公司编号。此表中的Job_Number可以与Job_No结合使用。在ERP_GLDATA表中。

Company_No.Job_NumberVARCAR(MAX)类型列。

ERP_GLDATA是条目信息。应该注意的是,每个工作不一定在每个日期,甚至每个月,或根本没有条目。 Entry_Date属于Date数据类型,Account_No.& Job_No.VARCAR(MAX)TotalBaseDecimal类型。

所需的输出如下:

enter image description here

有效地,输出应该在REFERENCEDATA_DATES表上生成每个作业的总计条目,包括月末日期。该示例还显示,即使该月份在该作业中没有实际条目,它仍应返回一个数字。希望图像能让事情变得清晰。

唯一的其他问题是ERP_GLDATA表需要进行过滤,只有Account_No. = 10000

任何人都可以指出我正确的方向(假设这在SQL中甚至可能)?

非常感谢提前。

在这种情况下,查询的效率不是问题(只要它运行我猜想!)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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