使用两个具有不同条件的左连接修复SQL

时间:2017-07-26 12:51:08

标签: mysql sql join subquery left-join

我正在尝试编写一个查询,它允许我在两个不同的连接中获取列的总和,但这两个连接将具有不同的条件。例如,我想从不同表中的记录中总结“matter_TotalBilled”,但我希望能够控制日期范围。所以下面我有这个问题:

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 

这里有两个连接。一个是“2016-10-1”和“2017-7-26”(MattersThisYear)之间的“Matter”行,另一个是“2015-10-1”和“2016-7”之间的“Matter”行26“(MattersLastYear)。

只要我只有“MattersThisYear”连接,此查询就可以工作,但只要我包含“MattersLastYear”连接,“SUM(MattersThisYear.matter_TotalBilled)”就会更改,即使这只是引用“MattersThisYear”加入。

我的意图是,对于每个团队,我想要返回今年和去年的事项_TotalBilled总和。

我需要在查询中更改哪些内容才能解决此问题?

更新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 

作为一个例子,看着名为“商业诉讼”的团队,“mattersThisYear”的价值是“16261750”。

当我运行此查询时:

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”。

3 个答案:

答案 0 :(得分:0)

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 

尝试以上查询。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

例如:当您单独执行这些查询时,您将获得以下数据。

Table: sys_Team
Teamid 
1

MattersThisYear子查询

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' 

现在你基于team_id加入sys_Team和MattersThisYear。

首次加入后的输出:

team_ID, matter_TotalBilled   , matter_TeamID , matter_DateOpened
1      , 100                  , 1             , '2016-10-1' 
1      , 100                  , 1             , '2017-7-26' 

现在,上面的结果集用于连接MattersLastYear子查询的结果集。

加入后,您将获得以下结果。

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_team没有两次相同的团队ID。

1)在子查询中使用日期过滤器。它也可以提高你的表现。 2)一旦在子查询中包含了matter_DateOpened,就可以从子查询中删除matter_DateOpened。 3)求和mattere_totalBilled并按team_ID使用group 4)对于两个子查询,执行1,2和3。 5)现在加入吧。