我可以通过SELECT行中没有的东西进行分组吗?

时间:2010-02-01 12:54:38

标签: sql

给出SQL中的命令;

SELECT ...
    FROM ...
    GROUP BY ...

我可以按不在SELECT行中的内容进行分组吗?

6 个答案:

答案 0 :(得分:3)

当然可以,例如

select 
   count(*)
from  
   some_table_with_updated_column
group by 
   trunc(updated, 'MM.YYYY') 

答案 1 :(得分:3)

是的,你可以这样做,但如果你这样做,你将无法分辨出哪个组的结果。

因此,您几乎总是希望在select子句中返回您已分组的列。但你没必要。

答案 2 :(得分:3)

这常用于superaggregate查询,如下所示:

SELECT  AVG(cnt)
FROM    (
        SELECT  COUNT(*) AS cnt
        FROM    sales
        GROUP BY
                product
        HAVING  COUNT(*) > 10
        ) q

,汇总聚合。

答案 3 :(得分:2)

是的,你可以。例如:

select count(1) 
  from sales
 group by salesman_id

当然,如果你的select子句(聚合函数除外)上有一些不属于group by子句的东西,你不能做什么。

答案 4 :(得分:1)

嗯,我认为这个问题本来应该是反过来的,

我可以选择GROUP BY中不存在的东西吗?

编写如下代码是可以的:

SELECT customerId, count(orderId) FROM orders
 GROUP BY customerId, orderedOn

如果您想查明客户日期订单的数量。 但你反而无法做到这一点:

SELECT customerId, orderedOn count(orderId) FROM orders
 GROUP BY customerId

您可以在组中没有的列上发出聚合函数。但是如果没有聚合函数,你不能在select行中给它。因为它没有多大意义。喜欢上面的查询。您只需按customerId进行订单计数,您希望日期也在输出中打印?? !!您没有将日期因素包含在组中以进行计数,那么它是否意味着要在其中包含日期?

答案 5 :(得分:0)

我不知道其他DBMS'但是DB2 / z,对于其中一个,这样做很好。不需要在选择部分中包含该列,但是,当然,它必须从表中提取数据以便聚合,因此您可能不会通过将其关闭来节省任何时间。您应该只选择所需的列,数据的聚合是一个单独的任务。

我非常肯定SQL标准允许这样做(尽管这只是基于大型机DB2产品非常接近它的知识)。