我有以下两个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
返回以下结果 -
我想要的是将它们组合在一个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行如下 -
有人可以建议我如何正确组合这两个查询,以便只返回5行。
答案 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)
它正在进行交叉加入,因为您没有说q1
和q2
是如何“相关”(加入)。
此外,由于您需要五行(即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