SQL从日期列提取月份并在JOIN命令中重用

SQL从日期列提取月份并在JOIN命令中重用,sql,sql-server,join,common-table-expression,Sql,Sql Server,Join,Common Table Expression,我有一个SQL查询(Microsoft SQL server),其中我从日期列中提取一个月。我想在join命令中重用这个提取的月份,将其作为一个标准,将结果与另一个表中的另一列连接起来 背景是在数据库中使用了日历时间,但我需要财政时间的结果。有一个表将日历时间和会计时间结合起来 从我查询的表中提取月份时,我希望将其连接到marry up表的日历月部分,该表包含会计年度和日历年日期。此表名为MSP_TimeByDay_OlapView,包含CalendarMemberKeyMonth和Fiscal

我有一个SQL查询(Microsoft SQL server),其中我从日期列中提取一个月。我想在join命令中重用这个提取的月份,将其作为一个标准,将结果与另一个表中的另一列连接起来

背景是在数据库中使用了日历时间,但我需要财政时间的结果。有一个表将日历时间和会计时间结合起来

从我查询的表中提取月份时,我希望将其连接到marry up表的日历月部分,该表包含会计年度和日历年日期。此表名为MSP_TimeByDay_OlapView,包含CalendarMemberKeyMonth和FiscalMemberKeyPeriod列

这样,最后我可以在结果中添加一列,其中包含会计月,并按此而不是日历月进行过滤

有效的查询,但对于日历-会计表中的字段返回NULL:

SELECT 
MSP_EpmProject_UserView.ProjectName,
MSP_EpmResource_UserView.ResourceName,
MSP_EpmResource_UserView.Discipline,
MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay) AS Month,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentMaterialWork) As Materials,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentWork) AS Work,
MSP_TimeByDay_OlapView.[CalendarMemberKeyMonth],
MSP_TimeByDay_OlapView.[FiscalMemberKeyPeriod]

FROM MSP_EpmResource_UserView 
     INNER JOIN ((MSP_EpmTask_UserView 
              INNER JOIN MSP_EpmProject_UserView 
          ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmProject_UserView.ProjectUID) 

                  INNER JOIN MSP_EpmAssignment ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmAssignment.ProjectUID 
          AND MSP_EpmTask_UserView.TaskUID = MSP_EpmAssignment.TaskUID) 

     ON MSP_EpmResource_UserView.ResourceUID = MSP_EpmAssignment.ResourceUID 
     INNER JOIN MSP_EpmAssignmentByDay_UserView 
     ON MSP_EpmAssignment.AssignmentUID = MSP_EpmAssignmentByDay_UserView.AssignmentUID 
     LEFT JOIN MSP_TimeByDay_OlapView
     ON MSP_EpmAssignmentByDay_UserView.[TimeByDay] = MSP_TimeByDay_OlapView.CalendarMemberKeyMonth

WHERE (MSP_EpmAssignmentByDay_UserView.TimeByDay BETWEEN '2016-01-01' AND '2016-12-31') 
GROUP BY
MSP_EpmProject_UserView.ProjectName,
MSP_EpmResource_UserView.ResourceName,
MSP_EpmResource_UserView.Discipline, 
MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay),
MSP_TimeByDay_OlapView.[CalendarMemberKeyMonth],
MSP_TimeByDay_OlapView.[FiscalMemberKeyPeriod]
这不起作用,因为联接的倒数第二行不包含SELECT语句中的MOUNT命令。但是,当我添加这个时,查询只运行几分钟(所以我取消了它)。以下是:

SELECT 
MSP_EpmProject_UserView.ProjectName,
MSP_EpmResource_UserView.ResourceName,
MSP_EpmResource_UserView.Discipline,
MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay) AS Month,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentMaterialWork) As Materials,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentWork) AS Work,
MSP_TimeByDay_OlapView.[CalendarMemberKeyMonth],
MSP_TimeByDay_OlapView.[FiscalMemberKeyPeriod]

FROM MSP_EpmResource_UserView 
     INNER JOIN ((MSP_EpmTask_UserView 
              INNER JOIN MSP_EpmProject_UserView 
          ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmProject_UserView.ProjectUID) 

                  INNER JOIN MSP_EpmAssignment ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmAssignment.ProjectUID 
          AND MSP_EpmTask_UserView.TaskUID = MSP_EpmAssignment.TaskUID) 

     ON MSP_EpmResource_UserView.ResourceUID = MSP_EpmAssignment.ResourceUID 
     INNER JOIN MSP_EpmAssignmentByDay_UserView 
     ON MSP_EpmAssignment.AssignmentUID = MSP_EpmAssignmentByDay_UserView.AssignmentUID 
     LEFT JOIN MSP_TimeByDay_OlapView
     ON MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay) = MSP_TimeByDay_OlapView.CalendarMemberKeyMonth

WHERE (MSP_EpmAssignmentByDay_UserView.TimeByDay BETWEEN '2016-01-01' AND '2016-12-31') 
GROUP BY
MSP_EpmProject_UserView.ProjectName,
MSP_EpmResource_UserView.ResourceName,
MSP_EpmResource_UserView.Discipline, 
MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay),
MSP_TimeByDay_OlapView.[CalendarMemberKeyMonth],
MSP_TimeByDay_OlapView.[FiscalMemberKeyPeriod]
我已经尝试实现了一个CTE,但没有成功,因为我不断地得到多部分标识符无法绑定的错误

WITH CTE(Ass)
AS
--Define CTE query.
(
SELECT MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay) AS Ass
FROM MSP_EpmAssignmentByDay_UserView
)

--Define outer query.
SELECT 
MSP_EpmProject_UserView.ProjectName,
MSP_EpmResource_UserView.ResourceName,
MSP_EpmResource_UserView.Discipline,
MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay) As Month,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentMaterialWork) As Materials,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentWork) AS Work,
MSP_TimeByDay_OlapView.[CalendarMemberKeyMonth],
MSP_TimeByDay_OlapView.[FiscalMemberKeyPeriod],
CTE.Ass

FROM MSP_EpmResource_UserView 
     INNER JOIN ((MSP_EpmTask_UserView 
              INNER JOIN MSP_EpmProject_UserView 
          ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmProject_UserView.ProjectUID) 

                  INNER JOIN MSP_EpmAssignment ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmAssignment.ProjectUID 
          AND MSP_EpmTask_UserView.TaskUID = MSP_EpmAssignment.TaskUID) 

     ON MSP_EpmResource_UserView.ResourceUID = MSP_EpmAssignment.ResourceUID 
     INNER JOIN MSP_EpmAssignmentByDay_UserView 
     ON MSP_EpmAssignment.AssignmentUID = MSP_EpmAssignmentByDay_UserView.AssignmentUID 
     FULL OUTER JOIN MSP_TimeByDay_OlapView
     ON CTE.Ass = MSP_TimeByDay_OlapView.CalendarMemberKeyMonth

WHERE (MSP_EpmAssignmentByDay_UserView.TimeByDay BETWEEN '2016-01-01' AND '2016-12-31') 
GROUP BY
MSP_EpmProject_UserView.ProjectName,
MSP_EpmResource_UserView.ResourceName,
MSP_EpmResource_UserView.Discipline, 
MONTH(MSP_EpmAssignmentByDay_UserView.TimeByDay),
MSP_TimeByDay_OlapView.[CalendarMemberKeyMonth],
MSP_TimeByDay_OlapView.[FiscalMemberKeyPeriod]

需要CTE吗?

我刚刚找到了问题的答案:)

不过,谢谢大家

加上一行,也加入了这一年,解决了这个问题。 这可能是无法解决的,因为没有其他时间级别也存在的信息——对此我深表歉意,但我没有想到这可能是问题所在

因此,如果有人尝试这样做(使用MS Project Server),请添加以下帮助:

AND YEAR(MSP_EpmAssignmentByDay_UserView.[TimeByDay]) = MSP_TimeByDay_OlapView.CalendarMemberKeyYear

现在的查询速度非常慢,但确实有效。

我刚刚找到了问题的答案:)

不过,谢谢大家

加上一行,也加入了这一年,解决了这个问题。 这可能是无法解决的,因为没有其他时间级别也存在的信息——对此我深表歉意,但我没有想到这可能是问题所在

因此,如果有人尝试这样做(使用MS Project Server),请添加以下帮助:

AND YEAR(MSP_EpmAssignmentByDay_UserView.[TimeByDay]) = MSP_TimeByDay_OlapView.CalendarMemberKeyYear

现在的查询速度非常慢,但确实有效。

语法显然是SQL Server,因此我删除了MySQL标记。您能否显示“运行分钟”的查询如果您在联接中包含月份,因为这听起来像是正确的解决方案将日历时间和会计时间结合在一起的表的名称是什么?@PaulHunt:我已将该查询添加到问题(第二个问题)。@DanBracuk:我已添加该查询,谢谢您的提问。这是MSP_TimeByDay_OlapView。语法显然是SQL Server,所以我删除了MySQL标记。您能显示“运行分钟”的查询,其中您在联接中包含月份,因为这听起来像是正确的解决方案吗?合并日历时间和会计时间的表的名称是什么?@PaulHunt:我已将该查询添加到问题中(第二个)。@DanBracuk:我已经补充了,谢谢你的提问。我是MSP_TimeByDay_OlapView。