我在尝试按日期和另一列生成运行总计时遇到问题。
我可以在一个简单的表上使用sum来创建一个运行总计,但在这种情况下,执行连接并按日期执行运行总计超出了我的诚实能力。
这一切都在Azure上的SQL Server数据库中(版本12)。
源数据表如下:
REFERENCEDATA_DATES
是一个日期表,涵盖所有输入日期和相应的月末日期。它可以与Entry_Date
中的ERP_GLDATA
结合使用。
Date
和EOM
是date
类型列。
ERP_JOBHEADERS
是系统中所有作业的列表以及相关的公司编号。此表中的Job_Number
可以与Job_No
结合使用。在ERP_GLDATA
表中。
Company_No.
和Job_Number
是VARCAR(MAX)
类型列。
ERP_GLDATA
是条目信息。应该注意的是,每个工作不一定在每个日期,甚至每个月,或根本没有条目。
Entry_Date
属于Date
数据类型,Account_No.
& Job_No.
为VARCAR(MAX)
,TotalBase
为Decimal
类型。
所需的输出如下:
有效地,输出应该在REFERENCEDATA_DATES
表上生成每个作业的总计条目,包括月末日期。该示例还显示,即使该月份在该作业中没有实际条目,它仍应返回一个数字。希望图像能让事情变得清晰。
唯一的其他问题是ERP_GLDATA
表需要进行过滤,只有Account_No. = 10000
。
任何人都可以指出我正确的方向(假设这在SQL中甚至可能)?
非常感谢提前。
在这种情况下,查询的效率不是问题(只要它运行我猜想!)。
答案 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