2016-07-27 42 views
1

我的代码是这样的SQL Server 2012的错误:每个GROUP BY表达式必须至少包含一列不是外部引用

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) ' 

现在,当我执行它没有返回错误。但是,当我尝试在运行时执行它,它会返回错误

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

我已经请参阅本http://www.sql-server-performance.com/2007/group-by-expression-contain-one-column-not-an-outer-reference/并尝试通过语句来更改组,也返回错误。

请帮忙!

回答

0

GROUP BY查询中,您不需要DISTINCT。另外,您正在选择不出现在GROUP BY子句中的列或列的聚合。拆卸与非聚合列沿着DISTINCT会离开你用下面的查询:(即使用summax等)

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'?顺便说一句,我会建议不要做动态sql太 – Eric

+0

谢谢你的评论。我已经应用了您的查询,但仍在运行时返回相同的错误。你认为我的选择陈述是问题吗? – Afiq

+0

我需要做动态的,因为我用它来调用存储过程。 @Eric – Afiq

0

因为你不聚合任何字段,你并不真正需要在你的例子中使用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

相关问题