0

アップデート :

-----

エラーは item テーブルの 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

つまり、エイリアスは であってはなり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 
于 2012-12-06T14:57:18.853 に答える
0

@Gordon Linoff が言うように、これはクエリ オプティマイザがこれを SUM 操作のように処理し、「jan2001」のサブクエリを正規化するためであることがほぼ確実です。

amt_pd 列が ITEM テーブルに存在する場合、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
于 2012-12-06T15:13:33.540 に答える