JOINING两个SELECT语句的结果,每个语句都有自己的WHERE条件和GROUPING

时间:2013-09-29 10:29:46

标签: sql sql-server-express

我有以下两个Select语句 -

SELECT * 
FROM tblAllocations
WHERE AllocID IN
(
    SELECT MAX(AllocID)    
    FROM tblAllocations
    WHERE FeeEarner = 'KLW' AND [Date] <= '2013-12-31'
    GROUP BY FeeEarner, CaseNo

SELECT UserID, CaseNo, SUM(Fees) AS [Fees]
FROM tblTimesheetEntries
WHERE UserID = 'KLW' AND [Date] <= '2013-12-31'
GROUP BY UserID, CaseNo

返回以下结果 -

Results of Separate Queries

我想要的是将它们组合在一个Select语句中,该语句从First Query中提取一些字段,从第二个查询中提取其他字段。根据上面的结果,应该只返回5行,其中三行将包含来自两个Query的字段,两个只有一个Query的字段(因此它会有一些NULL值)

我尝试了以下内容 -

SELECT q1.CaseNo, q1.FeeEarner, 
       q2.Fees AS [Fees], 
       q1.Fees AS [Billed], 
      (q2.Fees - q1.Fees) AS WIP
FROM
(
    SELECT * 
    FROM tblAllocations
    WHERE AllocID IN
    (
        SELECT MAX(AllocID)    
        FROM tblAllocations
        WHERE FeeEarner = 'KLW'
        AND [Date] <= '2013-12-31'
        GROUP BY FeeEarner, CaseNo
    )
) AS q1,
(
    SELECT UserID, CaseNo, SUM(Fees) AS [Fees]
    FROM tblTimesheetEntries
    WHERE UserID = 'KLW'
    AND [Date] <= '2013-12-31'
    GROUP BY UserID, CaseNo
) AS q2

然而,这就像一个交叉连接,给我15行如下 -

Erroneous Results

有人可以建议我如何正确组合这两个查询,以便只返回5行。

3 个答案:

答案 0 :(得分:1)

以下是更正的查询:

 SELECT q1.CaseNo, q1.FeeEarner, 
           q2.Fees AS [Fees], 
           q1.Fees AS [Billed], 
          (q2.Fees - q1.Fees) AS WIP
    FROM
    (
    SELECT * 
    FROM tblAllocations
    WHERE AllocID IN
    (
    SELECT MAX(AllocID)    
    FROM tblAllocations
    WHERE FeeEarner = 'KLW'
    AND [Date] <= '2013-12-31'
    GROUP BY FeeEarner, CaseNo
    )
    ) AS q1,
    (
    SELECT UserID, CaseNo, SUM(Fees) AS [Fees]
    FROM tblTimesheetEntries
    WHERE UserID = 'KLW'
    AND [Date] <= '2013-12-31'
    GROUP BY UserID, CaseNo
    ) AS q2
    where q1.CaseNo = q2.CaseNo

答案 1 :(得分:0)

它正在进行交叉加入,因为您没有说q1q2是如何“相关”(加入)。

此外,由于您需要五行(即tblTimesheetEntries中的所有行,而不管tblAllocations中的匹配),您应该使用右连接(或左侧但是反转{{1} }和q1):

q2

SqlFiddle here

答案 2 :(得分:0)

我会从你的第二个查询开始,然后LEFT-JOIN到你的第一个。第二个查询具有相应的案例编号15,25和33,它们将显示所有列,但也会显示案例5和12,这将导致其他列为NULL。

select 
      AllThese.UserID,
      AllThese.Fees,
      MaxAlloc.*
   from
      ( SELECT 
              UserID,
              CaseNo, 
              SUM(Fees) AS [Fees]
           FROM 
              tblTimesheetEntries
           WHERE 
                  UserID = 'KLW'
              AND [Date] <= '2013-12-31'
           GROUP BY 
              UserID, 
              CaseNo ) AllThese
      LEFT JOIN
      ( SELECT * 
           FROM tblAllocations
           WHERE AllocID IN
             ( SELECT MAX(AllocID)
                  FROM tblAllocations
                  WHERE FeeEarner = 'KLW'
                    AND [Date] <= '2013-12-31'
                  GROUP BY FeeEarner, CaseNo )) MaxAlloc
         on AllThese.CaseNo = MaxAlloc.CaseNo