【问题标题】:SQL INSERT INTO SELECT Statement Invalid use of group functionSQL INSERT INTO SELECT 语句无效使用组函数
【发布时间】:2013-08-27 14:07:31
【问题描述】:

我有以下查询:

INSERT INTO StatisticalConsultationAgreement VALUES (
   queryType, entityCode, entityType, queryClass,queryTables,period, 
   COUNT(queryClass),  SUM(numberRecords),  SUM(recordsFound),
   SUM(NorecordsFound), NOW(), 'system');
SELECT
   MONTH(EndDateTimeProcessing),YEAR(EndDateTimeProcessing),
   entityType,
   entityCode,
   queryType,
   queryClass,
   EndDateTimeProcessing as period
FROM agreementFile
WHERE 
  MONTH(EndDateTimeProcessing)=MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH )) 
  AND YEAR(EndDateTimeProcessing)=YEAR(CURDATE())
GROUP BY entityType,entitycode,queryType, queryClass;

当我运行查询时,我得到下一个错误:

Error code 1111, SQL state HY000: Invalid use of group function
Line 1, column 1

Executed successfully in 0,002 s.
Line 5, column 2

为什么会这样?

如何解决?

【问题讨论】:

  • 你能解释一下你想用这段代码做什么吗?有两条语句,一条有错误的 INSERT 命令(聚合函数 SUM 和 COUNT 不能在此上下文中使用),另一条 SELECT 语句。

标签: mysql mysql-error-1111


【解决方案1】:

您将values 语句与select 语句混合在insert 中。你只需要select。这是我对你想要的最好的猜测:

INSERT INTO StatisticalConsultationAgreement 
    SELECT queryType, entityCode, entityType, queryClass,queryTables,period, 
           COUNT(queryClass),  SUM(numberRecords),  SUM(recordsFound),
           SUM(NorecordsFound), NOW(), 'system'
    FROM agreementFile
    WHERE MONTH(EndDateTimeProcessing)=MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH )) AND
          YEAR(EndDateTimeProcessing)=YEAR(CURDATE())
    GROUP BY entityType, entitycode, queryType, queryClass;

但是,您还应该在insert 语句中列出StatisticalConsultationAgreement 的列名。

【讨论】:

    【解决方案2】:

    您没有对EndDateTimeProcessing 进行分组,当您尝试执行插入操作时,它无法从分组的行中找出应该采用哪个EndDateTimeProcessing 值。 解决方案是将其添加到您的组子句中:

     GROUP BY entityType,entitycode,queryType, queryClass, EndDateTimeProcessing;
    

    或者您使用函数组作为 MAX()、MIN() 等。

    最好的问候

    编辑

    正如 Gordon Linoff 所说,您还将查询与 INSERT 混合在一起,所有内容都应由查询获取。

    正确的语法应该是:

    INSERT INTO StatisticalConsultationAgreement
    SELECT
       'queryType', --I don't know what is the query type so i put it on single quote
       entityCode,
       entityType,
       queryClass,
       queryTables,
       MAX(EndDateTimeProcessing), --Period put on group function MAX, but it cant be grouped below or put into another group function
       COUNT(queryClass),  --
       SUM(numberRecords), --  ASUMING THOSE ARE COLUMNS IN  agreementFile
       SUM(recordsFound),  --
       SUM(NorecordsFound),-- 
       NOW(),
       'system'
    FROM agreementFile
    WHERE 
      MONTH(EndDateTimeProcessing)=MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH )) 
      AND YEAR(EndDateTimeProcessing)=YEAR(CURDATE())
    GROUP BY entityType,entitycode,queryType, queryClass;
    

    查询的字段MONTH(EndDateTimeProcessing),YEAR(EndDateTimeProcessing), 已被删除,因为我不知道 thouse 应该在哪里

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 2011-12-04
      • 2021-01-19
      • 1970-01-01
      • 2017-11-09
      • 2014-02-07
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多