Mysql 修复具有两个具有不同条件的左联接的SQL

Mysql 修复具有两个具有不同条件的左联接的SQL,mysql,sql,join,subquery,left-join,Mysql,Sql,Join,Subquery,Left Join,我正在尝试编写一个查询,该查询将允许我获取两个不同联接中的列之和,但这两个联接将具有不同的条件。例如,我想对不同表中记录的账单进行合计,但我希望能够控制日期范围。下面我有一个问题: SELECT SUM(MattersThisYear.matter_TotalBilled) AS mattersThisYear, SUM(MattersLastYear.matter_TotalBilled) AS mattersLastYear FROM sys_Team LEFT JOIN (

我正在尝试编写一个查询,该查询将允许我获取两个不同联接中的列之和,但这两个联接将具有不同的条件。例如,我想对不同表中记录的账单进行合计,但我希望能够控制日期范围。下面我有一个问题:

SELECT  
SUM(MattersThisYear.matter_TotalBilled) AS mattersThisYear, 
SUM(MattersLastYear.matter_TotalBilled) AS mattersLastYear 

FROM sys_Team 

LEFT JOIN (
SELECT matter_TotalBilled, matter_TeamID, matter_DateOpened 
FROM Company 
LEFT JOIN ClientRelationship ON 
ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
INNER JOIN Matter ON 
Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
GROUP BY matter_ID) AS MattersThisYear ON 
MattersThisYear.matter_TeamID = sys_Team.team_ID 
AND MattersThisYear.matter_DateOpened >= '2016-10-1' 
AND MattersThisYear.matter_DateOpened <= '2017-7-26' 

LEFT JOIN (
SELECT matter_TotalBilled, matter_TeamID, matter_DateOpened 
FROM Company 
LEFT JOIN ClientRelationship ON 
ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
INNER JOIN Matter ON 
Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
GROUP BY matter_ID) AS MattersLastYear ON 
MattersLastYear.matter_TeamID = sys_Team.team_ID 
AND MattersLastYear.matter_DateOpened >= '2015-10-1' 
AND MattersLastYear.matter_DateOpened <= '2016-7-26' 

GROUP BY team_ID 
SELECT team_Name, 
SUM(MattersThisYear.mattersThisYear) AS mattersThisYear 
#SUM(MattersLastYear.mattersLastYear) AS mattersLastYear 
FROM sys_Team 
LEFT JOIN 
(
    SELECT matter_TotalBilled as mattersThisYear,0 as mattersLastYear, matter_TeamID, matter_DateOpened -- made change at this line
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    GROUP BY matter_ID
) AS MattersThisYear ON MattersThisYear.matter_TeamID = sys_Team.team_ID 
AND MattersThisYear.matter_DateOpened >= '2016-10-1' 
AND MattersThisYear.matter_DateOpened <= '2017-7-26' 
#LEFT JOIN 
#(
#    SELECT 0 as mattersThisYear,matter_TotalBilled as mattersLastYear, matter_TeamID, matter_DateOpened  -- made change at this line
#    FROM Company 
#    LEFT JOIN ClientRelationship ON 
#    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
#    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
#    INNER JOIN Matter ON 
#    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
#    GROUP BY matter_ID
#) AS MattersLastYear ON MattersLastYear.matter_TeamID = sys_Team.team_ID 
#AND MattersLastYear.matter_DateOpened >= '2015-10-1' 
#AND MattersLastYear.matter_DateOpened <= '2016-7-26' 

GROUP BY team_ID 
这里有两个连接。其中一个用于2016-10-1和2017-7-26年度之间的事项行,另一个用于2015-10-1和2016-7-26年度之间的事项行

只要我只有MattersThisYear加入,此查询就可以工作,但只要我包括MattersLastYear加入,SummatersThisYear.matter\u TotalBilled更改,即使这只是引用MattersThisYear加入

我的意图是,对于每个团队,我希望返回今年和去年的事项账单总额

要解决此问题,我需要在查询中更改什么

更新1:

这是我运行以下查询时得到的输出:

SELECT team_Name, 
SUM(MattersThisYear.mattersThisYear) AS mattersThisYear, 
SUM(MattersLastYear.mattersLastYear) AS mattersLastYear 
FROM sys_Team 
LEFT JOIN 
(
    SELECT matter_TotalBilled as mattersThisYear,0 as mattersLastYear, matter_TeamID, matter_DateOpened -- made change at this line
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    GROUP BY matter_ID
) AS MattersThisYear ON MattersThisYear.matter_TeamID = sys_Team.team_ID 
AND MattersThisYear.matter_DateOpened >= '2016-10-1' 
AND MattersThisYear.matter_DateOpened <= '2017-7-26' 
LEFT JOIN 
(
    SELECT 0 as mattersThisYear,matter_TotalBilled as mattersLastYear, matter_TeamID, matter_DateOpened  -- made change at this line
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    GROUP BY matter_ID
) AS MattersLastYear ON MattersLastYear.matter_TeamID = sys_Team.team_ID 
AND MattersLastYear.matter_DateOpened >= '2015-10-1' 
AND MattersLastYear.matter_DateOpened <= '2016-7-26' 

GROUP BY team_ID 
例如,看看名为“商业诉讼”的团队,Matters今年的价值是16261750

运行此查询时:

SELECT  
SUM(MattersThisYear.matter_TotalBilled) AS mattersThisYear, 
SUM(MattersLastYear.matter_TotalBilled) AS mattersLastYear 

FROM sys_Team 

LEFT JOIN (
SELECT matter_TotalBilled, matter_TeamID, matter_DateOpened 
FROM Company 
LEFT JOIN ClientRelationship ON 
ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
INNER JOIN Matter ON 
Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
GROUP BY matter_ID) AS MattersThisYear ON 
MattersThisYear.matter_TeamID = sys_Team.team_ID 
AND MattersThisYear.matter_DateOpened >= '2016-10-1' 
AND MattersThisYear.matter_DateOpened <= '2017-7-26' 

LEFT JOIN (
SELECT matter_TotalBilled, matter_TeamID, matter_DateOpened 
FROM Company 
LEFT JOIN ClientRelationship ON 
ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
INNER JOIN Matter ON 
Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
GROUP BY matter_ID) AS MattersLastYear ON 
MattersLastYear.matter_TeamID = sys_Team.team_ID 
AND MattersLastYear.matter_DateOpened >= '2015-10-1' 
AND MattersLastYear.matter_DateOpened <= '2016-7-26' 

GROUP BY team_ID 
SELECT team_Name, 
SUM(MattersThisYear.mattersThisYear) AS mattersThisYear 
#SUM(MattersLastYear.mattersLastYear) AS mattersLastYear 
FROM sys_Team 
LEFT JOIN 
(
    SELECT matter_TotalBilled as mattersThisYear,0 as mattersLastYear, matter_TeamID, matter_DateOpened -- made change at this line
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    GROUP BY matter_ID
) AS MattersThisYear ON MattersThisYear.matter_TeamID = sys_Team.team_ID 
AND MattersThisYear.matter_DateOpened >= '2016-10-1' 
AND MattersThisYear.matter_DateOpened <= '2017-7-26' 
#LEFT JOIN 
#(
#    SELECT 0 as mattersThisYear,matter_TotalBilled as mattersLastYear, matter_TeamID, matter_DateOpened  -- made change at this line
#    FROM Company 
#    LEFT JOIN ClientRelationship ON 
#    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
#    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
#    INNER JOIN Matter ON 
#    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
#    GROUP BY matter_ID
#) AS MattersLastYear ON MattersLastYear.matter_TeamID = sys_Team.team_ID 
#AND MattersLastYear.matter_DateOpened >= '2015-10-1' 
#AND MattersLastYear.matter_DateOpened <= '2016-7-26' 

GROUP BY team_ID 
然后这个值变成我期望的值,即130094

SELECT  
SUM(MattersThisYear.mattersThisYear) AS mattersThisYear, 
SUM(MattersLastYear.mattersLastYear) AS mattersLastYear 
FROM sys_Team 
LEFT JOIN 
(
    SELECT matter_TotalBilled as mattersThisYear,0 as mattersLastYear, matter_TeamID, matter_DateOpened -- made change at this line
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID
WHERE  matter_DateOpened >= '2016-10-1' 
AND matter_DateOpened <= '2017-7-26' 


    GROUP BY matter_ID
) AS MattersThisYear ON MattersThisYear.matter_TeamID = sys_Team.team_ID 

LEFT JOIN 
(
    SELECT 0 as mattersThisYear,matter_TotalBilled as mattersLastYear, matter_TeamID, matter_DateOpened  -- made change at this line
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    WHERE  matter_DateOpened >= '2015-10-1' 
AND matter_DateOpened <= '2016-7-26' 

    GROUP BY matter_ID
) AS MattersLastYear ON MattersLastYear.matter_TeamID = sys_Team.team_ID 

GROUP BY team_ID 

尝试上面的查询。

由于您试图在两个联接中放置相同的列名,我认为您可能希望在联接之前将它们合并在一起

SELECT team_Name, 
SUM(MattersBothYears.mattersThisYear) AS mattersThisYear, 
SUM(MattersBothYears.mattersLastYear) AS mattersLastYear 
FROM sys_Team 
LEFT JOIN (
(
    SELECT matter_TotalBilled as mattersThisYear,0 as mattersLastYear, matter_TeamID, matter_DateOpened
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    AND Matter.matter_DateOpened >= '2016-10-1' 
    AND Matter.matter_DateOpened <= '2017-7-26' 
    GROUP BY matter_ID
) 
UNION ALL
(
    SELECT 0 as mattersThisYear,matter_TotalBilled as mattersLastYear, matter_TeamID, matter_DateOpened
    FROM Company 
    LEFT JOIN ClientRelationship ON 
    ClientRelationship.clientrelationship_RelatedToItemID = Company.company_ID 
    AND ClientRelationship.clientrelationship_SOSRelFile = 'OR' 
    INNER JOIN Matter ON 
    Matter.matter_ClientID = ClientRelationship.clientrelationship_ClientID 
    AND Matter.matter_DateOpened >= '2015-10-1' 
    AND Matter.matter_DateOpened <= '2016-7-26' 
    GROUP BY matter_ID
) 
) MattersBothYears ON MattersBothYears.matter_TeamID = sys_Team.team_ID 
GROUP BY team_ID

您加入查询的方式不正确。当您加入sys_团队时,首先使用MattersThisYear子查询。可能会有多个matter_TeamID,如果您加入MattersLastYear子查询,则可能会得到错误的结果

例如:当您单独执行这些查询时,会出现以下数据

Table: sys_Team
Teamid 
1
MattersThiseyear子查询

matter_TotalBilled, matter_TeamID, matter_DateOpened
100               , 1            , '2016-10-1' 
100               , 1            , '2017-7-26' 
MattersLastYear子查询

matter_TotalBilled, matter_TeamID, matter_DateOpened
50                , 1            , '2015-10-1' 
50                , 1            , '2016-7-26' 
现在,根据团队id,您今年将以Matters加入sys_团队

第一次联接后的输出:

team_ID, matter_TotalBilled   , matter_TeamID , matter_DateOpened
1      , 100                  , 1             , '2016-10-1' 
1      , 100                  , 1             , '2017-7-26' 
现在,上面的resultset用于联接MattersLastYear子查询的resultset

加入后你会得到以下结果

team_ID, matter_TotalBilled   , matter_TeamID , matter_DateOpened, matter_TotalBilled , matter_DateOpened
1      , 100                  , 1             , '2016-10-1'      , 50                 , '2015-10-01'
1      , 100                  , 1             , '2017-7-26'      , 50                 , '2015-10-01'
1      , 100                  , 1             , '2016-10-1'      , 50                 , '2016-7-26'
1      , 100                  , 1             , '2017-7-26'      , 50                 , '2016-7-26' 
你把它加起来,就会得到错误的结果

对你的问题提出建议。我假设sys_团队没有两次相同的团队id

1在子查询中使用日期过滤器。它还可以提高您的性能。 2在子查询中包含matter_DateOpen后,可以从子查询中删除matter_DateOpen。 3按团队ID列出的mattere_totalBilled和use group总和 4对两个子查询执行1、2和3。
5现在加入吧

不幸的是,它不起作用。当我将MattersLastYear加入注释掉,并将SUMMattersLastYear.MattersLastYear注释掉MattersLastYear作为MattersLastYear时,对于特定团队中的MattersThistYear,我得到的值为130094。当我运行查询时,该值变为16261750。我只是想确认一下,我预计是130094而不是16261750。我不明白为什么第二次连接会改变这个值。@Darren输出是什么?您期望的输出是什么??