2011-04-21 106 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