为什么我在这个简单的查询中需要Group by?

时间:2012-12-06 14:16:39

标签: sql sql-server

更新:

-----

错误可能是项目表中的总和(si.amt_pd)(因为没有关系):

select SUM(si.amt_pd)amt_pd from [HMIS_REPORTING].HMIS_RPT_ME.dbo.item  i
                    where 

有解决方法吗?

----------

我正在尝试运行此查询。查询只根据某些表获取一个月的数量。它只是一个大问题的一部分。

select s.sales_Contract_Nbr
     , s.Sales_Id
     , s.Sale_Dt
     , YEAR(s.Sale_Dt) 'YEAR'
     , MONTH(s.Sale_Dt) 'MONTH'
     , s.Sales_Need_TYpe_Cd
     , s.Sales_Status_Cd
     , si.Posted
     , s.location_Cd
     , jan2011 = (
          select SUM(si.amt_pd)amt_pd 
          from [HMIS_REPORTING].HMIS_RPT_ME.dbo.item  i
          where i.Item_Id  = si.Product_Item_ID
            and i.Item_Cd <> '*INT'
            and convert(varchar(10),SI.Sales_Item_Dt,126) >= '2011-01-01'   
            and convert(varchar(10),SI.Sales_Item_Dt,126) >= '2011-01-31'
            ) INTO dbo.#a_acomparision

FROM [HMIS_REPORTING].HMIS_RPT_ME.dbo.Sales S 
   , [HMIS_REPORTING].HMIS_RPT_ME.dbo.Sales_Item SI 

WHERE SI.Sales_Id = S.Sales_Id 
  and s.Sales_Contract_Nbr in (
      select distinct (Sales_Contract_Nbr) 
      from mountainviewContracts 
      where Sales_Contract_Nbr <> '')

但是我收到以下错误消息。

Msg 8120, Level 16, State 1, Line 1
Column 'HMIS_REPORTING.HMIS_RPT_ME.dbo.Sales.Sales_Contract_Nbr' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我只是无法理解为什么我的查询应该为sales_contract_nbr分组,即使我放入group by子句它告诉我内部查询si.Product_item_id和SI.sales_item_dt也应该包含在group by子句中。

请帮帮我。

提前致谢

2 个答案:

答案 0 :(得分:1)

这是一个非常微妙的问题。但是,我认为子查询应该是:

select SUM(i.amt_pd)amt_pd from [HMIS_REPORTING].HMIS_RPT_ME.dbo.item  i

也就是说,别名应为i而不是si

发生的事情是子查询中的sum位于外部查询中的值上。因此,SQL编译器假定聚合查询。一旦发现第一列不是聚合,它就会抱怨你拥有的消息。

顺便说一句,您应该使用正确的连接语法,因此from子句如下所示:

FROM [HMIS_REPORTING].HMIS_RPT_ME.dbo.Sales S join
     [HMIS_REPORTING].HMIS_RPT_ME.dbo.Sales_Item SI 
     on SI.Sales_Id = S.Sales_Id 

答案 1 :(得分:0)

正如@Gordon Linoff所说,这几乎可以肯定是因为查询优化器将此视为SUM操作,将子查询规范化为“jan2001”。

如果ITEM表中存在amt_pd列,则Gordon的解决方案是正确的。

如果没有,您必须添加group by语句,如下所示。

select s.sales_Contract_Nbr
     , s.Sales_Id
     , s.Sale_Dt
     , YEAR(s.Sale_Dt) 'YEAR'
     , MONTH(s.Sale_Dt) 'MONTH'
     , s.Sales_Need_TYpe_Cd
     , s.Sales_Status_Cd
     , si.Posted
     , s.location_Cd
     , jan2011 = (
          select SUM(si.amt_pd)amt_pd 
          from [HMIS_REPORTING].HMIS_RPT_ME.dbo.item  i
          where i.Item_Id  = si.Product_Item_ID
            and i.Item_Cd <> '*INT'
            and convert(varchar(10),SI.Sales_Item_Dt,126) >= '2011-01-01'   
            and convert(varchar(10),SI.Sales_Item_Dt,126) >= '2011-01-31'
            ) INTO dbo.#a_acomparision

FROM [HMIS_REPORTING].HMIS_RPT_ME.dbo.Sales S 
   , [HMIS_REPORTING].HMIS_RPT_ME.dbo.Sales_Item SI 

WHERE SI.Sales_Id = S.Sales_Id 
  and s.Sales_Contract_Nbr in (
      select distinct (Sales_Contract_Nbr) 
      from mountainviewContracts 
      where Sales_Contract_Nbr <> '')
GROUP BY s.sales_Contract_Nbr
     , s.Sales_Id
     , s.Sale_Dt
     , YEAR
     , MONTH
     , s.Sales_Need_TYpe_Cd
     , s.Sales_Status_Cd
     , si.Posted
     , s.location_Cd