繁体   English   中英

当我只想要一个时聚合查询返回多行

[英]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没有选择calltimeintavetimeint ,而是希望选择每个列的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM