【问题标题】:SQL: aggregate function or the GROUP BYSQL:聚合函数或 GROUP BY
【发布时间】:2012-08-31 22:12:35
【问题描述】:

以下是我收到的一条 sql 语句和一个错误。我已经包含了两个表中所有可能的字段,有什么问题?我想按 prodID 对所有返回的项目进行分组

选择列表中的“orders.adminStatus”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

 SELECT TOP 20 
         ADMINSTATUS,   CURRENCY,   CUSTOMERID,     CUSTOMERMESSAGE,    DELTIME,    DELTOTAL,   DISCOUNT,   DISCOUNTCODE,   
         IP,    ITEMDES,    OPTIONS,    ORDEREDID,  ORDERTOTAL,
         oi.ORDER_ID,   o.ORDER_ID,     PAYMENTTYPE,    PPRICE,     PRODID,     QTY,    REASON,     SECURITYKEY,    SHIPADDRESS1,   
         SHIPADDRESS2,  SHIPADDRESS3,   SHIPCITY,   SHIPCOMPANY,    
         SHIPCOUNTRY,   SHIPCOUNTY,     SHIPMETHOD,
         SHIPNAME,  SHIPPOSTCODE,   STATUS,     STOCKCODE,  SUBTOTAL,   TAX,    TAXABLE,    TIMEDATE,   TXAUTHNO,   VENDORTXCODE,   VPSTXID
         FROM orderedItems oi
         left join orders o on  oi.order_id = o.order_id


    Group by PRODID

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    因为,正如它所说,如果您使用 GROUP BY,您要么需要按要返回的字段进行分组,要么对其应用聚合函数;例如:最大值、最小值等

    SELECT TOP 20  
             ADMINSTATUS,   CURRENCY,   CUSTOMERID,     CUSTOMERMESSAGE,    DELTIME,    DELTOTAL,   DISCOUNT,   DISCOUNTCODE,    
             IP,    ITEMDES,    OPTIONS,    ORDEREDID,  ORDERTOTAL, 
             oi.ORDER_ID,   o.ORDER_ID,     PAYMENTTYPE,    PPRICE,     PRODID,     QTY,    REASON,     SECURITYKEY,    SHIPADDRESS1,    
             SHIPADDRESS2,  SHIPADDRESS3,   SHIPCITY,   SHIPCOMPANY,     
             SHIPCOUNTRY,   SHIPCOUNTY,     SHIPMETHOD, 
             SHIPNAME,  SHIPPOSTCODE,   STATUS,     STOCKCODE,  SUBTOTAL,   TAX,    TAXABLE,    TIMEDATE,   TXAUTHNO,   VENDORTXCODE,   VPSTXID 
             FROM orderedItems oi 
             left join orders o on  oi.order_id = o.order_id 
    
    
    
    Group by          ADMINSTATUS,   CURRENCY,   CUSTOMERID,     CUSTOMERMESSAGE,    DELTIME,    DELTOTAL,   DISCOUNT,   DISCOUNTCODE,    
         IP,    ITEMDES,    OPTIONS,    ORDEREDID,  ORDERTOTAL, 
         oi.ORDER_ID,   o.ORDER_ID,     PAYMENTTYPE,    PPRICE,     PRODID,     QTY,    REASON,     SECURITYKEY,    SHIPADDRESS1,    
         SHIPADDRESS2,  SHIPADDRESS3,   SHIPCITY,   SHIPCOMPANY,     
         SHIPCOUNTRY,   SHIPCOUNTY,     SHIPMETHOD, 
         SHIPNAME,  SHIPPOSTCODE,   STATUS,     STOCKCODE,  SUBTOTAL,   TAX,    TAXABLE,    TIMEDATE,   TXAUTHNO,   VENDORTXCODE,   VPSTXID 
    

    【讨论】:

    • +1 看起来我们都写了同样的东西,所以我想我必须为你的答案投票! :-)
    • 我认为这可能意味着我们都以编写相当多的 SQL 为生:-)
    【解决方案2】:

    如果您选择单独的列,则它们都需要出现在 GROUP BY 子句中,除非它们是聚合函数。

    请看这里:http://msdn.microsoft.com/en-us/library/ms177673.aspx

    例如

    SELECT TOP 20 
             ADMINSTATUS,   CURRENCY,   CUSTOMERID,     CUSTOMERMESSAGE,    DELTIME,    DELTOTAL,   DISCOUNT,   DISCOUNTCODE,   
             IP,    ITEMDES,    OPTIONS,    ORDEREDID,  ORDERTOTAL,
             oi.ORDER_ID,   o.ORDER_ID,     PAYMENTTYPE,    PPRICE,     PRODID,     QTY,    REASON,     SECURITYKEY,    SHIPADDRESS1,   
             SHIPADDRESS2,  SHIPADDRESS3,   SHIPCITY,   SHIPCOMPANY,    
             SHIPCOUNTRY,   SHIPCOUNTY,     SHIPMETHOD,
             SHIPNAME,  SHIPPOSTCODE,   STATUS,     STOCKCODE,  SUBTOTAL,   TAX,    TAXABLE,    TIMEDATE,   TXAUTHNO,   VENDORTXCODE,   VPSTXID
             FROM orderedItems oi
             left join orders o on  oi.order_id = o.order_id
    
    
        Group by ADMINSTATUS,   CURRENCY,   CUSTOMERID,     CUSTOMERMESSAGE,    DELTIME,    DELTOTAL,   DISCOUNT,   DISCOUNTCODE,   
             IP,    ITEMDES,    OPTIONS,    ORDEREDID,  ORDERTOTAL,
             oi.ORDER_ID,   o.ORDER_ID,     PAYMENTTYPE,    PPRICE,     PRODID,     QTY,    REASON,     SECURITYKEY,    SHIPADDRESS1,   
             SHIPADDRESS2,  SHIPADDRESS3,   SHIPCITY,   SHIPCOMPANY,    
             SHIPCOUNTRY,   SHIPCOUNTY,     SHIPMETHOD,
             SHIPNAME,  SHIPPOSTCODE,   STATUS,     STOCKCODE,  SUBTOTAL,   TAX,    TAXABLE,    TIMEDATE,   TXAUTHNO,   VENDORTXCODE,   VPSTXID
    

    【讨论】:

      【解决方案3】:

      由于您是按 PRODID 分组的,因此在选择列表中应该只存在 PRODID,如果您想要选择列表中的任何其他列,则应该使用聚合函数,如 AVG()、MIN() MAX() 等..

      如果按表中所有可用列分组,则等于

      select distinct * from table
      

      通常 GROUP BY 与聚合函数一起使用以获取表中每个组的 MIN、MAX 等

      GROUP BY examples

      【讨论】:

      • 您不必显示分组依据的字段,尽管在这种情况下这可能是一个红鲱鱼。
      • @podiluska:我的意思是,除了 PRODID,您不能在选择列表中提供任何内容,尽管 PRODID 在选择列表中是可选的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2014-08-24
      • 2014-12-27
      相关资源
      最近更新 更多