2017-07-26 14 views
0

2つの異なる結合の列の合計を得ることができるクエリを作成しようとしていますが、これらの2つの結合の条件は異なります。たとえば、 "matter_TotalBilled"を別のテーブルのレコードから合計したいが、日付範囲を制御できるようにしたい。したがって、私はこのクエリを持っています:条件が異なる2つの左結合による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 

ここに2つの結合があります。 1つは「2016-10-1」と「2017-7-26」(MattersThisYear)の間の「Matter」行で、もう1つは「2015-10-1」と「2016-7- 26 "(MattersLastYear)。

このクエリは、「MattersThisYear」結合のみを保持していますが、「MattersLastYear」結合を含めるとすぐに、「SUM(MattersThisYear.matter_TotalBilled)」が変更されますが、「MattersThisYear "参加する。

私の意図は、チームごとに、今年と昨年の問題について、matter_TotalBilledの合計を返すことです。

この問題を解決するには、クエリで何を変更する必要がありますか?

UPDATE 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 

例として、「商業訴訟」という名前のチームを見て、値:

これは、私は次のクエリを実行したときに私が手に出力され「今年のこと」は「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

2つの結合で同じ列名を使用しようとしているので、結合する前にそれらを結合することをお勧めします。

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重要事項」とコメントすると、特定のチームの「mattersThisYear」の値が「130094」になります。クエリを実行すると、その値は「16261750」になります。確かに、私はそれが "16261750"ではなく "130094"になると期待しています。 2番目の結合がこの値を変更する理由はわかりません。 – Darren

+0

@ダーレン出力は何ですか? –

+0

あなたの期待する出力は? –

0

クエリに参加する方法が正しくありません。最初にMattersThisYearサブクエリでsys_Teamに参加しています。複数のmatter_TeamIDを持つ可能性があり、MattersLastYearサブクエリに参加すると間違った結果が得られる可能性があります。

例:これらのクエリを個別に実行すると、次のデータが表示されます。 TEAM_IDに基づいMattersThisYearと

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' 

今、あなたは参加sys_Team。最初に参加した後

出力:

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を2回も持っていないと仮定しています。

1)サブクエリ内で日付フィルタを使用します。あなたのパフォーマンスも向上させることができます。 2)サブクエリの中にmatter_DateOpenedを含めたら、サブクエリからmatter_DateOpenedを削除することができます。 3)sum mattere_totalBilledとteam_IDでグループを使用 4)どちらのサブクエリに対しても1、2、3を実行します。 5)今すぐ参加してください。

関連する問題