2016-07-27 9 views
1

私のコードは、このSQL Server 2012のエラー:私はそれがエラーを返していない実行するために今とき表現することにより、各グループが

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

ALTER PROCEDURE [dbo].[getprocbyproc] 
    @flg varchar(2), 
    @qaaprvdt char(8), 
    @dbo varchar(20), 
    @plantid char(1) 
AS 
    DECLARE @dynamicSQL varchar(8000) 
    DECLARE @datemth char(6) 
    DECLARE @dateday char(2) 
    DECLARE @FXTIME char(4) 
    DECLARE @TBL varchar(20) 
    DECLARE @def varchar(20) 
    DECLARE @OUTDAT CHAR(20) 

    SET @datemth = substring(@qaaprvdt,1,6) 
    SET @dateday = substring(@qaaprvdt,7,2) 

    IF @flg = 'QA' AND @dbo = 'PRCDAILYQA' 
    BEGIN 
     SET @TBL = 'DAILYQA' 
     SET @OUTDAT = 'CO.QAAPRVDT' 
    END 

    IF @plantid = '1' 
    BEGIN 
     SET @def = "SQDPRCDEF1" 
    END 

    IF @flg = 'QA' AND @plantid = '1' 
    BEGIN 
     SET @dynamicSQL = 'insert into PrcdailyQA' + 
          '(process, seqno, qaamon, qaaday, orderno, 
          ingotno, theopcs, cwacc, pwacc, pwout, 
          procyld, prodyld, plantid, prodline) ' + 
          '(SELECT distinct(b.PROCNO), b.proseq, "' + 
          @datemth + '" , "' + @dateday +  
          '", a.orderno, a.ingotno, a.theopcs, a.cwacc, a.pwacc, a.pwout, a.COprocyld, a.COprodyld, a.plantid, a.prodline ' + 
          'FROM DailyQA a , SQDPRCDEF1 b ' + 
          'WHERE a.qaamon = ' + @datemth + ' and a.qaaday= ' + @DATEDAY + ' and  a.plantid="1"' + 
          'GROUP BY b.procno, b.proseq, a.orderno, a.ingotno, a.theopcs, a.cwacc, a.pwacc, a.pwout, a.COprocyld, a.COprodyld, a.plantid, a.prodline) ' 

のようである外部参照ではない少なくとも1つの列が含まれている必要があります。私は、実行時にそれを実行しようとする。しかし、それは私がすでにこのhttp://www.sql-server-performance.com/2007/group-by-expression-contain-one-column-not-an-outer-reference/を参照し、エラーを返すも、文によってグループを変更しようと、エラー

Msg 164, Level 15, State 1, Line 1
Each GROUP BY expression must contain at least one column that is not an outer reference.

を返します。

助けてください!

答えて

0

GROUP BYクエリではDISTINCTは必要ありません。また、GROUP BY句に表示されない列または列の集合である列を選択しています。非集計列と一緒にDISTINCTを削除すると、次のクエリであなたを残して:

INSERT INTO PrcdailyQA (process, seqno, qaamon, qaaday, orderno, ingotno, theopcs, cwacc, 
         pwacc, pwout, procyld, prodyld, plantid, prodline) 
SELECT b.PROCNO, b.proseq, a.orderno, a.ingotno, a.theopcs, a.cwacc, a.pwacc, a.pwout, 
     a.COprocyld, a.COprodyld, a.plantid, a.prodline 
FROM DailyQA a, SQDPRCDEF1 b 
WHERE a.qaamon = ' + @datemth + ' AND a.qaaday = ' + @DATEDAY + ' AND a.plantid = "1"' 
GROUP BY b.procno, b.proseq, a.orderno, a.ingotno, a.theopcs, a.cwacc, a.pwacc, a.pwout, 
     a.COprocyld, a.COprodyld, a.plantid, a.prodline 
+0

SELECTステートメントに 'a.qaamon'と' a.qaaday'がありませんか? btw、私も動的SQLをしないことをお勧めします – Eric

+0

あなたのコメントいただきありがとうございます。あなたのクエリを適用しましたが、実行時に同じエラーを返します。私の選択した声明が問題だと思いますか? – Afiq

+0

私は動的にこれをストアドプロシージャで呼び出すために使用する必要があります。 @Eric – Afiq

0

あなたはどの分野に集約されていないので(すなわちsummaxなどを使用して)、あなたは本当にする必要はありませんあなたの例ではgroup by句を使用してください。

しかし、from句で何をしようとしていますか?あなたは現在、2つのテーブルのうちcartesian productを作成しています - あなたは共通フィールドのテーブルに参加していません。

より多くを知らなくても、私は完全にgroup by句を削除して、このような何かを持ってする傾向があると思い:

insert into ... 
select distinct b.PROCNO, b.proseq, ... 
from ... 
where ... 

ところで、一般的に私はfrom句にカンマを使用してお勧めしません、代わりにjoinを使用してください。

+0

実際にこのコードをSQL 2005で使用しましたが、エラーはありません。今すぐ2012に移行すると、このエラーが表示されます。 – Afiq

+0

@Afiq - このクエリは投稿されたエラーを生成しません... – sgeddes

関連する問題