2011-04-10 103 views
4

我正在使用Microsoft SQL Svr Mgmt Studio 2008.我無權創建臨時表(公司限制創建或修改表的能力),或者我將使用它來解決此問題。總結聯合查詢

我已成功使用聯合查詢來組合三個選擇查詢的結果。現在我正在努力總結工會的結果。

當我執行下面的查詢我收到:

Incorrect syntax near the keyword 'GROUP' 

,然後當我被我刪除該組獲得:

​​

這裏是我的查詢到目前爲止:

Select Period, PCC, SUM(BasicHits), SUM(FareHits), SUM(SearchHits) 
From (

SELECT  AAAPeriod AS Period, 
AAAFromPCC AS PCC, 
- SUM(AAABasic) AS BasicHits, 
- SUM(AAAFare) AS FareHits, 
- SUM(AAASearch) AS SearchHits 
FROM  HitsAaa 
HAVING  (AAAPeriod = N'2010-10') 

UNION ALL 

SELECT  AAAPeriod, 
AAAtoPCC, 
SUM(AAABasic), 
SUM(AAAFare), 
SUM(AAASearch) 
FROM  HitsAaa 
HAVING  (AAAPeriod = N'2010-10') 

UNION ALL 

SELECT  AgtPeriod, 
AgtPcc, 
SUM(AgtBasic), 
SUM(AgtFare), 
SUM(AgtSearch) 
FROM   HitsAgent 
HAVING  (AgtPeriod = N'2010-10') 

)GROUP BY Period, PCC 

我以前的任何問題都無法找到解決方案。

+0

第2個查詢相同? (所有三個都缺少一個「GROUP BY」)。你的派生表需要一個表別名。 – 2011-04-10 18:16:08

+0

你是對的,我通過錯誤的子查詢刪除了組。 – ksh7 2011-04-10 19:26:14

回答

5

你需要別名你的派生表,你還必須使用具有having子句的組。

SELECT 
    q1.Period, 
    q1.PCC, 
    SUM(q1.BasicHits), 
    SUM(q1.FareHits), 
    SUM(q1.SearchHits) 
FROM (SELECT  
     AAAPeriod AS Period, 
     AAAFromPCC AS PCC, 
     - SUM(AAABasic) AS BasicHits, 
     - SUM(AAAFare) AS FareHits, 
     - SUM(AAASearch) AS SearchHits 
     FROM HitsAaa 
     GROUP BY 
     AAAPeriod, 
     AAAFromPCC 
     HAVING (AAAPeriod = N'2010-10') 

     UNION ALL 

     SELECT  
     AAAPeriod AS Period, 
     AAAtoPCC AS PCC, 
     SUM(AAABasic) AS BasicHits, 
     SUM(AAAFare) AS FareHits, 
     SUM(AAASearch) AS SearchHits 
     FROM HitsAaa 
     GROUP BY 
     AAAPeriod, 
     AAAtoPCC 
     HAVING (AAAPeriod = N'2010-10') 

     UNION ALL 

     SELECT 
     AgtPeriod AS Period, 
     AgtPcc AS PCC, 
     SUM(AgtBasic) AS BasicHits, 
     SUM(AgtFare) AS FareHits, 
     SUM(AgtSearch) AS SearchHits 
     FROM HitsAgent 
     GROUP BY 
     AgtPeriod, 
     AgtPCC 
     HAVING (AgtPeriod = N'2010-10')) q1 
GROUP BY 
    q1.Period, 
    q1.PCC 
2

我用不上創建 臨時表(公司限制 創建或修改表的能力)或 我會用它來解決這個問題 。

取而代之的是臨時​​表,嘗試使用表變量:

declare @t table (id int primary key, col1 varchar(50)) 
insert @t (col1) values ('hello table variable') 
select * from @t 

表變量可以完成大部分的事情臨時表即可。

像馬丁(現已刪除)回答表明,考慮給予子查詢的別名,如:

select ... list of columns ... 
from (
     ... subquery ... 
     ) as SubQueryAlias 
group by 
     col1 

而在你的子查詢中,having也許應該是一個where

... 
FROM  HitsAaa 
WHERE  (AAAPeriod = N'2010-10') 
... 
4

SQL Server要求您定義的表別名派生表/內嵌視圖:

SELECT x.period, x.pcc, SUM(x.BasicHits), SUM(x.FareHits), SUM(x.SearchHits) 
    FROM (SELECT AAAPeriod AS Period, 
       AAAFromPCC AS PCC, 
       - SUM(AAABasic) AS BasicHits, 
       - SUM(AAAFare) AS FareHits, 
       - SUM(AAASearch) AS SearchHits 
      FROM HitsAaa 
     WHERE AAAPeriod = N'2010-10' 
     GROUP BY aaaperiod, aaafrompcc 
     UNION ALL 
     SELECT AAAPeriod, 
       AAAtoPCC, 
       SUM(AAABasic), 
       SUM(AAAFare), 
       SUM(AAASearch) 
      FROM HitsAaa 
     WHERE AAAPeriod = N'2010-10' 
     GROUP BY aaaperiod, aaafrompcc 
     UNION ALL 
     SELECT AgtPeriod, 
       AgtPcc, 
       SUM(AgtBasic), 
       SUM(AgtFare), 
       SUM(AgtSearch) 
      FROM HitsAgent 
     WHERE AgtPeriod = N'2010-10' 
     GROUP BY agtperiod, agtpcc) AS x 
GROUP BY x.period, x.pcc 
+0

謝謝!!!添加T和T指定工作。感謝大家對此的幫助。 – ksh7 2011-04-10 19:24:40

2

你的第一個行更改爲

Select T.Period, T.PCC, SUM(T.BasicHits), SUM(T.FareHits), SUM(T.SearchHits) 

和最後一行

) T GROUP BY T.Period, T.PCC 

您需要def INE表別名(在這種情況下T)爲內表

此外,需要GROUP BY內查詢

+0

+1:不必使用表別名,但SQL Server確實需要爲派生表/內聯視圖定義它們。 – 2011-04-10 18:30:00