0

更新 :

-----

错误可能在项目表中的 sum(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,即使我放入 group by 子句,它也告诉我内部查询 si.Product_item_id 和 SI.sales_item_dt 也应该包含在 group by 子句中。

请帮帮我。

提前致谢

4

2 回答 2

1

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

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

也就是说,别名不应该isi

发生的事情是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 
于 2012-12-06T14:57:18.853 回答
0

As @Gordon Linoff says, this is almost certainly because the query optimizer is treating this like a SUM operation, normalizing away the subquery for "jan2001".

If the amt_pd column is present in the ITEM table, Gordon's solution is the right one.

If not, you have to add the group by statement, as below.

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
于 2012-12-06T15:13:33.540 回答