【问题标题】:SQL Error (1111): Invalid use of group functionSQL 错误 (1111):组函数的使用无效
【发布时间】:2013-02-05 12:41:50
【问题描述】:

我正在尝试获取(entrydate 列中的最大日期)和(entrydate 列中的最大日期 - 15 天)之间的数据!!

Table1:总共有 953 行

Table2:总共有 400 行

我遇到了这个错误,请帮助我!!

    Select  
o_material_transaction_inward.Mat_Code,
s_material_details.Mat_Spec,
s_material_details.Mat_Make,
o_material_transaction_inward.Sup_Name,
o_material_transaction_inward.Entry_Date,
o_material_transaction_inward.DC_qty,
o_material_transaction_inward.Received_qty,
    from 
o_material_transaction_inward 
    join 
s_material_details 
    on 
s_material_details.Mat_Code=o_material_transaction_inward.Mat_Code and s_material_details.Mat_Group_Id=o_material_transaction_inward.Mat_Group_id
    where 
o_material_transaction_inward.Entry_Date between Max(o_material_transaction_inward.Entry_Date) and Max(o_material_transaction_inward.Entry_Date - 15)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    更新:修正BETWEEN谓词:

    它不起作用的原因是最低值必须是BETWEEN 谓词中的第一个值,因此为了从两个表中获取这些行,在最大输入日期之间具有entry_date - 15 和最大入境日期试试这个:

    SELECT
      o.Mat_Code,
      s.Mat_Spec,
      s.Mat_Make,
      o.Sup_Name,
      DATE_FORMAT(o.Entry_Date, '%Y-%m-%d') AS Entry_Date,
      o.DC_qty,
      o.Received_qty
    FROM o_material_transaction_inward AS o
    INNER JOIN s_material_details      AS s  ON s.Mat_Code     = o.Mat_Code
    WHERE o.Entry_Date BETWEEN ((SELECT Max(Entry_Date) 
                                FROM o_material_transaction_inward) - 15)
                           AND (SELECT Max(Entry_Date) 
                                FROM o_material_transaction_inward) ;
    

    SQL Fiddle Demo

    【讨论】:

    • 0rows 作为输出受到影响,我使用 Have 而不是 between,但它获取了除我预期的 15 行之外的所有行。
    • @RanjitKumar - 您能否添加这两个表o_material_transaction_inwards_material_details 的一些示例数据以及您希望从这两个表中获得的预期结果。这将非常有帮助。谢谢。
    【解决方案2】:

    试试:

        Select  
    o_material_transaction_inward.Mat_Code,
    s_material_details.Mat_Spec,
    s_material_details.Mat_Make,
    o_material_transaction_inward.Sup_Name,
    o_material_transaction_inward.Entry_Date,
    o_material_transaction_inward.DC_qty,
    o_material_transaction_inward.Received_qty,
        from 
    o_material_transaction_inward 
        join 
    s_material_details 
        on 
    s_material_details.Mat_Code=o_material_transaction_inward.Mat_Code and s_material_details.Mat_Group_Id=o_material_transaction_inward.Mat_Group_id
        having 
    o_material_transaction_inward.Entry_Date between Max(o_material_transaction_inward.Entry_Date) and Max(o_material_transaction_inward.Entry_Date - 15)
    

    (有关wherehaving 的解释,请参阅MySQL: Invalid use of group function 的已接受答案)

    【讨论】:

    • 它提取了所有行,除了 15 行!
    • SQL 错误 (1054):“有子句”中的未知列“o_material_transaction_inward.Entry_Date”
    【解决方案3】:

    这应该可行:

    SELECT
      o.Mat_Code,
      s.Mat_Spec,
      s.Mat_Make,
      o.Sup_Name,
      o.Entry_Date,
      o.DC_qty,
      o.Received_qty,
    FROM o_material_transaction_inward AS o
    INNER JOIN s_material_details      AS s  ON s.Mat_Code     = o.Mat_Code
                                            AND s.Mat_Group_Id = o.Mat_Group_id
    WHERE o.Entry_Date BETWEEN (SELECT Max(Entry_Date) 
                                FROM o_material_transaction_inward) 
                           AND (SELECT Max(Entry_Date) 
                                FROM o_material_transaction_inward) - 15);
    

    【讨论】:

    • 没有错误,也有 0 行作为输出受到影响。它没有获取 (Max date) 和 (Max date-15) 之间的数据
    • 为了选择 Max(Entry Date),我在下面的查询中使用了这个,但它没有用。 (SELECT DATE_SUB(Max(Entry_Date),INTERVAL 15 DAY) FROM o_material_transaction_inward) 在最后一行
    猜你喜欢
    • 2017-12-27
    • 2020-07-12
    • 1970-01-01
    • 2021-11-21
    • 2012-07-20
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多