计算月度预算的SQL查询

计算月度预算的SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,上面是我们必须计算每月预算的表格结构 我们正在显示每个名字的条形图,显示他们每月的预算情况。 假设我们拿Sam来说,他一月的预算是620,二月的预算是580,依此类推,所以我们需要计算每个月的预算,直到DateDeleted有值为止 我们可以计算每个员工姓名的每月预算,但无法 找出如何连续几个月计算它们 求求你,任何人,帮我这个忙 如何为上述方法编写SQL。 请提供样品表数据 希望这有帮助 CREATE TABLE [dbo].[EmployeeMonthlyBudget] ( [Nam

上面是我们必须计算每月预算的表格结构

我们正在显示每个名字的条形图,显示他们每月的预算情况。 假设我们拿Sam来说,他一月的预算是620,二月的预算是580,依此类推,所以我们需要计算每个月的预算,直到
DateDeleted
有值为止

我们可以计算每个员工姓名的每月预算,但无法 找出如何连续几个月计算它们

求求你,任何人,帮我这个忙 如何为上述方法编写SQL。 请提供样品表数据

希望这有帮助

CREATE TABLE [dbo].[EmployeeMonthlyBudget]
(
    [Name] [NVARCHAR](50) NULL,
    [Budget_Day] [MONEY] NULL,
    [DateCreated] [DATETIME] NULL,
    [DateDeleted] [DATETIME] NULL
) 

INSERT INTO [dbo].[EmployeeMonthlyBudget] ([Name], [Budget_Day], [DateCreated], [DateDeleted]) 
VALUES (N'SAM', 20.0000, CAST(N'2018-01-01T00:00:00.000' AS DateTime), CAST(N'2018-10-01T00:00:00.000' AS DateTime)),
       (N'ROB', 10.0000, CAST(N'2018-01-01T00:00:00.000' AS DateTime), NULL),
       (N'TAM', 5.0000, CAST(N'2018-01-01T00:00:00.000' AS DateTime), CAST(N'2018-05-01T00:00:00.000' AS DateTime)),
       (N'TAN', 100.0000, CAST(N'2018-01-01T00:00:00.000' AS DateTime), NULL)   
选择A.Name、A.budget\u day、B.MonthName、B.totaldays*A.budget\u day作为MonthlySpent
从…起
[dbo][EmployeeMonthlyBudget]A
内连接(
选择[Name],DATENAME(MONTH,DATEADD(MONTH,nos.monthnos,[DateCreated])-1)作为MonthName,DAY(EOMONTH(DATEADD(MONTH,nos.monthnos,[DateCreated])-1)作为totaldays,MONTH(EOMONTH,DATEADD(MONTH,nos.monthnos,[DateCreated])-1)作为monthOrder
来自[dbo]。[EmployeeMonthlyBudget]
内部联接(选择1个月Nos UNION选择2个UNION选择3
联合选择4联合选择5联合选择6
联合选择7联合选择8联合选择9

联合选择10联合选择11联合选择12)不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不G
SELECT A.Name,A.budget_day,B.MonthName,B.totaldays*A.budget_day as MonthlySpent
FROM 
[dbo].[EmployeeMonthlyBudget] A
inner join(
SELECT [Name] , DATENAME(MONTH, DATEADD(MONTH, nos.monthnos, [DateCreated])-1) AS MonthName,DAY(EOMONTH(DATEADD(MONTH, nos.monthnos, [DateCreated])-1)) as totaldays,month(EOMONTH(DATEADD(MONTH, nos.monthnos, [DateCreated])-1)) as monthOrder
from [dbo].[EmployeeMonthlyBudget]
inner join    (SELECT 1 monthnos UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) nos on  nos.monthnos <= DATEDIFF(MONTH, [DateCreated],isnull([DateDeleted],GETDATE()))+1
 ) B on
A.NAME=B.Name 
order by A.Name,monthOrder 
       select name,budget_day,monthname,totalspent from
(Select j.* ,row_number () over (partition by j.name,j.monthname order by j.totalspent) as rn

from

(Select B.name,A.budget_day,MonthName,(datediff(day,[DateCreated],DefaultDate)+1)*A.budget_day as TotalSpent,monthOrder
from (SELECT 
  *, [Budget_Day]*DATEDIFF(day,[DateCreated],isnull([DateDeleted],GETDATE())) as TotalSpent,  DATENAME(MONTH, [DateCreated]) AS MonthNameStart, DATENAME(MONTH,isnull([DateDeleted],GETDATE())) AS MonthNameEND
from 
   [dbo].[EmployeeMonthlyBudget]
 where datecreated<=isnull(datedeleted,getdate())) A
LEFT join 


(
SELECT [Name] , DATENAME(MONTH, DATEADD(MONTH, nos.monthnos-1, [DateCreated])) AS MonthName,EOMONTH([DateCreated]) as DefaultDate ,
DAY(EOMONTH(DATEADD(MONTH, nos.monthnos, [DateCreated])-1)) as totaldays,
month(DATEADD(MONTH, nos.monthnos-1, [DateCreated])) as monthOrder
from [dbo].[EmployeeMonthlyBudget]
inner join    (SELECT 1 monthnos UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) nos on  nos.monthnos <= DATEDIFF(MONTH, [DateCreated],isnull([DateDeleted],GETDATE()))

)  B
on A.MonthNameStart =B.MonthName and 
A.Name=B.name

UNION

Select B.name,A.budget_day,MonthName,((datediff(day,DefaultDate,isnull([Datedeleted],getdate())))+1)*A.budget_day as TotalSpent,monthOrder from
(SELECT 
  *, [Budget_Day]*DATEDIFF(day,[DateCreated],isnull([DateDeleted],GETDATE())) as TotalSpent,  DATENAME(MONTH, [DateCreated]) AS MonthNameStart, DATENAME(MONTH,isnull([DateDeleted],GETDATE())) AS MonthNameEND
from 
   [dbo].[EmployeeMonthlyBudget]
   where datecreated<=isnull(datedeleted,getdate())) A
   inner join 


(SELECT [Name] , DATENAME(MONTH, DATEADD(MONTH, nos.monthnos, [DateCreated])-1) AS MonthName,DATEADD(month, DATEDIFF(month, 0, isnull([DateDeleted],getdate())), 0) as DefaultDate,
DAY(EOMONTH(DATEADD(MONTH, nos.monthnos, [DateCreated])-1)) as totaldays,
month(EOMONTH(DATEADD(MONTH, nos.monthnos, [DateCreated])-1)) as monthOrder
from [dbo].[EmployeeMonthlyBudget]
inner join    (SELECT 1 monthnos UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) nos on  nos.monthnos <= DATEDIFF(MONTH, [DateCreated],isnull([DateDeleted],GETDATE()))+1)  B
on A.MonthNameEND =B.MonthName and A.Name=B.name

UNION


SELECT B.name,A.budget_day,MonthName,totaldays*A.budget_day as TotalSpent ,monthOrder
FROM 
[dbo].[EmployeeMonthlyBudget] A
inner join(
SELECT [Name] , DATENAME(MONTH, DATEADD(MONTH, nos.monthnos-1, [DateCreated])) AS MonthName,EOMONTH([DateCreated]) as DefaultDate ,
DAY(EOMONTH(DATEADD(MONTH, nos.monthnos-1, [DateCreated]))) as totaldays,
month(DATEADD(MONTH, nos.monthnos-1, [DateCreated])) as monthOrder
from [dbo].[EmployeeMonthlyBudget]
inner join    (SELECT 1 monthnos UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) nos on  nos.monthnos <= DATEDIFF(MONTH, [DateCreated],isnull([DateDeleted],GETDATE()))
 where datecreated<=isnull(datedeleted,getdate())
) B on
A.NAME=B.Name


 )j)k
where k.rn=1 and k.name is not null
order by k.name,k.monthOrder