2011-04-21 57 views
0

多行,这是原来的查询汇总查询返回时,我只想要一个

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 

,其中用户ID匹配和组名相匹配查询名称

查询

这是我用的

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

只是做一个对两个查询联接:

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 

OLD ANSWER,基于以前版本的问题,而不是选择calltimeintavetimeint它看起来的

像你想选择这些列中的每一列的总和,并将它们从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的意思是“为每个不同的用户标识,通话时间和平均时间组合返回一行”。

你真正的意思(大概)是“为每个用户返回一行”,所以你应该只有useridGROUP BY

+0

没有工作生病后所发生的事情上去顶 – whatsupprogrammers 2011-04-21 18:55:11

+1

@whatsup应该在哪里“31548.330000”和“8”从何而来?你想要最小值(不是SUM,因为你的原始查询显示“? – 2011-04-21 18:59:07

+0

在我开始之前,我开始添加calltimeint和avetimeint等通话数据,我只收集验证为8和31548.33的销售数据。由于某种原因,通话数据收集每行的这些信息,然后添加它 – whatsupprogrammers 2011-04-21 19:08:58

1

试试这个:

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 
+0

谢谢你的方法有优势吗? – whatsupprogrammers 2011-04-21 19:36:37

+0

不,我只是真的很慢在网站上得到它。所以我不认为它实际上是任何不同的。 APART从我SUMMING的CalTime和AVeTimeInt每个用户。 – 2011-04-21 19:37:38