在连接表上聚合

时间:2013-05-31 05:58:00

标签: sql sql-server sql-server-2008

我使用以下查询,以获得如下所示的结果。实际上查询只是加入了2个表。

SELECT MT.mkt_Area_ID,MA.mkt_Reg_ID,MT.mktcate_id,MT.target_Amt,MT.year 
FROM [CRM].[tblMktArea_Target] MT JOIN CRM.tblMarketingArea MA 
ON MA.mkt_Area_ID= MT.mkt_Area_ID WHERE month IN (05,04) AND year=2013 AND MA.mkt_Area_ID=1 
AND MA.mkt_Reg_ID =1 

enter image description here

如何通过mktcate_id对结果进行分组,以获得每个类别的target_amt总和?

我试过了:

SELECT MT.mkt_Area_ID,MA.mkt_Reg_ID,MT.mktcate_id,Sum(MT.target_Amt),MT.year 
    FROM [CRM].[tblMktArea_Target] MT JOIN CRM.tblMarketingArea MA 
    ON MA.mkt_Area_ID= MT.mkt_Area_ID WHERE month IN (05,04) AND year=2013 AND MA.mkt_Area_ID=1 
    AND MA.mkt_Reg_ID =1 group by MT.mktcate_id

并得到错误

2 个答案:

答案 0 :(得分:2)

您将收到异常,因为必须在GROUP BY子句中添加非聚合列。例如,

SELECT MT.mkt_area_id, 
       MA.mkt_reg_id, 
       MT.mktcate_id, 
       SUM(MT.target_amt), 
       MT.year 
FROM   [CRM].[TBLMKTAREA_TARGET] MT 
       JOIN CRM.TBLMARKETINGAREA MA 
         ON MA.mkt_area_id = MT.mkt_area_id 
WHERE  month IN ( 05, 04 ) 
       AND year = 2013 
       AND MA.mkt_area_id = 1 
       AND MA.mkt_reg_id = 1 
GROUP  BY   MT.mktcate_id, 
            MT.mkt_area_id, 
            MA.mkt_reg_id,
            MT.year

答案 1 :(得分:1)

对于不在聚合函数内的所有列(例如SUM,MAX,AVG),应始终使用GROUP BY。 将MT.mkt_Area_ID,MA.mkt_Reg_ID,MT.year字段放入GROUP BY子句:

 SELECT MT.mkt_Area_ID,
           MA.mkt_Reg_ID,
           MT.mktcate_id,
           Sum(MT.target_Amt),
           MT.year 
      FROM [CRM].[tblMktArea_Target] MT JOIN CRM.tblMarketingArea MA ON 
              MA.mkt_Area_ID = MT.mkt_Area_ID 
     WHERE month IN (05,04) AND 
           year = 2013 AND 
           MA.mkt_Area_ID = 1 AND 
           MA.mkt_Reg_ID = 1 
  GROUP BY MT.mktcate_id,
           MT.mkt_Area_ID,
           MA.mkt_Reg_ID,
           MT.year

或从SELECT子句中删除MT.mkt_Area_ID,MA.mkt_Reg_ID,MT.year字段:

 SELECT MT.mktcate_id,
           Sum(MT.target_Amt)
     FROM [CRM].[tblMktArea_Target] MT JOIN CRM.tblMarketingArea MA ON 
            MA.mkt_Area_ID = MT.mkt_Area_ID 
     WHERE month IN (05,04) AND 
           year = 2013 AND 
           MA.mkt_Area_ID = 1 AND 
           MA.mkt_Reg_ID = 1 
  GROUP BY MT.mktcate_id