[英]Aggregate query returning multiple rows when I only want one
这是原始查询
SELECT 'MSD-RES-CRUISE' AS QUERYNAME, dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT(dbo.BOOKINGS.USERID) AS TOTAL2
FROM dbo.BOOKINGS INNER JOIN dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
WHERE (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, Dateadd(day,2, @startdate)) AND CONVERT(int, Dateadd(day,2, @enddate))) AND (dbo.MAJOR.SDESCR = 'Cruises') AND
(dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A') and dbo.BOOKINGS.STATUS <> 'XL' GROUP BY dbo.BOOKINGS.USERID
我想加入的查询
SELECT calltimeint, avetimeint
FROM dbo.agentdailycalls
where userid = @user and date1 between @startdate and @enddate
用户名匹配且组名匹配查询名的位置
这就是我用的
SELECT t0.QUERYNAME, t0.USERID, total, TOTAL2, calltimeint, avetimeint
FROM ( SELECT 'MSD-RES-CRUISE' AS QUERYNAME, dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT(dbo.BOOKINGS.USERID) AS TOTAL2
FROM dbo.BOOKINGS INNER JOIN dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
WHERE (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, Dateadd(day,2, @startdate)) AND CONVERT(int, Dateadd(day,2, @enddate))) AND (dbo.MAJOR.SDESCR = 'Cruises') AND
(dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A') and dbo.BOOKINGS.STATUS <> 'XL' GROUP BY dbo.BOOKINGS.USERID
) t0
INNER JOIN ( SELECT sum(calltimeint) as calltimeint, sum(avetimeint) as avetimeint , userid
FROM dbo.agentdailycalls
where userid = @user and date1 between @startdate and @enddate and GroupName = 'MSD-RES-CRUISE'
group by userid
) t1 ON t1.userId = t0.USERID
只需对两个查询执行JOIN:
SELECT QUERYNAME, USERID, total, TOTAL2, calltimeint, avetimeint
FROM ('MSD-RES-CRUISE' ... GROUP BY abcfiles.dbo.BOOKINGS.USERID) t0
INNER JOIN (SELECT userid, groupname, calltimeint, avetimeint ... and @enddate) t1
ON t1.userId = t0.USERID AND t01.groupname = t0.QUERYNAME
旧答案,基于先前版本的问题
avetimeint
没有选择calltimeint
和avetimeint
,而是希望选择每个列的SUM并将其从GROUP BY
删除:
SELECT ... SUM(dbo.agentdailycalls.calltimeint), SUM(dbo.agentdailycalls.avetimeint)
FROM dbo.BOOKINGS INNER JOIN ...
GROUP BY dbo.BOOKINGS.USERID
将它们添加到GROUP BY
意味着您希望这些值的每种不同组合都包含一行。 因此, GROUP BY userid, calltimeint, avetimeint
意思是“为用户ID,呼叫时间和平均时间的每种不同组合返回一行。”
您的真正含义(大概是)是“为每个用户返回一行”,因此您应该仅在GROUP BY
具有userid
。
尝试这个:
SELECT 'MSD-RES-CRUISE' AS QUERYNAME
, abcfiles.dbo.BOOKINGS.USERID
, SUM(tt.calltime)
, SUM(tt.aveTimeint)
, SUM(abcfiles.dbo.BOOKINGS.APRICE) AS total
, COUNT(abcfiles.dbo.BOOKINGS.USERID) AS TOTAL2
FROM abcfiles.dbo.BOOKINGS
INNER JOIN abcfiles.dbo.TOURS
ON abcfiles.dbo.BOOKINGS.TOUR = abcfiles.dbo.TOURS.TOUR
INNER JOIN abcfiles.dbo.MAJOR
ON abcfiles.dbo.TOURS.MAJOR = abcfiles.dbo.MAJOR.MAJOR
INNER JOIN (SELECT
calltime
, aveTimeint
FROM
dbo.agentdailycalls adc
) tt
ON tt.userid = abcfiles.dbo.BOOKINDS.USERID
AND tt.date1 BETWEEN @startdate AND @endDate***
WHERE (abcfiles.dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, Dateadd(day,2, @startdate)) AND CONVERT(int, Dateadd(day,2, @enddate)))
AND (abcfiles.dbo.MAJOR.SDESCR = 'Cruises')
AND (abcfiles.dbo.BOOKINGS.USERID = @USER)
AND (abcfiles.dbo.MAJOR.DIVISION = 'A')
and abcfiles.dbo.BOOKINGS.STATUS <> 'XL'
GROUP BY abcfiles.dbo.BOOKINGS.USERID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.