2012-08-31 95 views
1

下面是一条sql语句和我收到的错误。我已经包含了来自两个表格的所有可能的字段,什么是错的?我想组,因为它不是在聚合函数或GROUP BY子句SQL:聚合函数或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 

回答

1

如果您选择单独的列,它们都需要出现在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 
+0

感谢有道理现在:) – Prometheus

2

因为包含了所有归还物品由PRODID

列“orders.adminStatus”在选择列表中无效,正如它所说的那样,如果您使用的是GROUP BY,则需要按您要返回的字段进行分组,或者对其应用集合函数;例如:MAX,MIN等

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 
+0

+1看起来我们都写了同样的东西,所以我想我必须为您的答案投票! :-) –

+0

@Dommer就一定意味着你有一个很好的答案:) – podiluska

+0

我想这可能意味着我们都写SQL公平一点为生:-) –

1

既然你是PRODID分组,在选择列表中只PRODID应该存在,如果你想在选择列表中的任何其他列,应该用骨料finction给出像AVG(),MIN() MAX()等。

如果通过表中的所有可用列组,它等于

select distinct * from table 

通常使用GROUP BY与集合函数一起拿到MIN,MAX等每个组在一张桌子上

GROUP BY examples

+2

你不链接不必显示你正在分组的场地,尽管在这种情况下这可能是一个红鲱鱼。 – podiluska

+0

@podiluska:我的意思是,除了PRODID,你不能在选择列表中给出任何东西,但PRODID在选择列表中是可选的 –

相关问题