2017-07-26 87 views
0

我想写一个查询,将允许我在两个不同的连接中获得一列的总和,但这两个连接将有不同的条件。例如,我想从不同表中的记录中总结“matter_TotalBilled”,但我希望能够控制日期范围。所以下面我有这个查询:修复SQL与两个不同条件的左连接

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- 26“(MattersLastYear)。

只要我只有“MattersThisYear”连接,但只要包括“MattersLastYear”连接,“SUM(MattersThisYear.matter_TotalBilled)”更改,即使这只是引用“MattersThisYear” “加入。

我的意图是,对于每个团队,我想在今年和去年返回事项matter_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”。

回答

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

试试上面的查询。

+0

不幸的是,当我评论“MattersLastYear”加入,并注释“SUM(MattersLastYear.mattersLastYear)AS mattersLastYear”时,我会在特定团队中为“mattersThisYear”获得“130094”的值。当我运行您的查询时,该值变为“16261750”。为了确认,我预计它是“130094”而不是“16261750”。我不明白为什么第二次连接会改变这个值。 – Darren

+0

@达伦最新输出? –

+0

你的预期输出是什么? –

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' 

与MattersThisYear现在你加入sys_Team基于TEAM_ID。

输出后先加入:

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 4)做两个子查询1,2和3。 5)现在加入它。