Совокупный запрос, возвращающий несколько строк, когда я хочу только одну - PullRequest
0 голосов
/ 21 апреля 2011

это исходный запрос

  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 

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Просто присоединитесь к двум запросам:

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

СТАРЫЙ ОТВЕТ, основан на предыдущей версии вопроса

Вместо выбора calltimeint и avetimeint похоже, что вы хотите выбрать сумму каждого из этих столбцов и удалить их из 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 означает «вернуть одну строку для каждой различной комбинации идентификатора пользователя, времени вызова и среднего времени».

То, что вы действительно имели в виду (предположительно), это «вернуть одну строку для каждого пользователя», поэтому у вас должно быть только userid в GROUP BY.

1 голос
/ 21 апреля 2011

Попробуйте:

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 
...