2010-02-01 37 views
1

給定SQL中的命令;我可以按不在SELECT行中的內容進行分組嗎?

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

我可以按不在SELECT行中的內容進行分組嗎?

+1

換臺 - 如果只是*在SQL命令行中輸入一條語句來嘗試它,那麼工作太多了,我們怎麼能期待這個可憐的傢伙在忙碌的一天中抽出時間回到這裏並接受回答從誰幫助他的人? – 2010-02-01 15:10:55

回答

3

當然可以例如

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

是的,你可以。例如:

select count(1) 
    from sales 
group by salesman_id 

你不能做什麼,當然,如果有你的SELECT子句不屬於group by子句的一部分東西(除了聚合函數等)。

+1

令人遺憾的是MySQL *不允許你把所有的東西放在select子句中,即使它不在group中。這導致實際上執行的查詢被破壞。這樣,問題常常隱藏起來,變得很難找到。 – 2010-02-01 13:35:58

+1

哇...不知道。難過的聽到。感謝您的評論。 – 2010-02-01 14:19:52

0

我不知道其他數據庫管理系統的情況,但是DB2/z就是這樣做的。不需要在選擇部分中有列,但當然,它必須從表中提取數據才能進行聚合,因此您可能不會節省任何時間。你應該只選擇你需要的列,數據的聚合是一個獨立的任務。我很確定SQL標準允許這樣做(儘管這只是基於大型機DB2產品緊跟其後的知識)。

3

是的,你可以做到這一點,但如果你這樣做,你將無法知道哪個結果是哪個組。

因此,您幾乎總是希望返回您在select子句中分組的列。但你不必這樣做。

3

是的。

這通常被用來在查詢superaggregate這樣:

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

,其聚集的聚集體。

1

嗯,我覺得這個問題應該已經在另一種方式圓似,

我可以選擇的東西,是不是有在GROUP BY?

這是正常的寫代碼,如:

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

如果你想找出由客戶datewise完成的訂單數。 但你不能做到這一點倒過來:

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

可以發出上是不存在的組由列的聚合函數。但是你不能在沒有聚集函數的選擇行中給它。因爲它沒有多大意義。就像上面的查詢一樣。您只需通過customerId進行訂單計數,並且您希望日期也可以打印在輸出中!你不需要在組中加入日期因子來進行計數,那麼它是否意味着需要在其中有一個日期?

相關問題