在下面的代碼中,為什么我不能對表中的每一行使用count()?count( ) 必須回傳每行的顏色數,所有顏色都變成一,但事實并非如此。如果我使用group by,它會。
select colour,count(*)
from bricks;
更新: 另一個例子:
select b.*,
(select count(*) from bricks where colour=b.colour)
from bricks b;
上面的例子使用了沒有 group by 的分組功能,它沒有任何錯誤
uj5u.com熱心網友回復:
這正是 SQL 要求的方式。如果不列出 group by 陳述句中的離散列,則無法選擇離散列和聚合函式。
您的第二個示例為從主積木查詢回傳的每條記錄運行一個子查詢。這不會像使用 group by 的第一個查詢那樣執行。
你最好給你的子查詢表起別名 - 我已經看到決議器決定你本質上是在說 b.colour = b.colour 的情況,這將為你在磚塊中的每條記錄提供相同的計數(*)。
uj5u.com熱心網友回復:
我沒有那些積木,但是 - 我有 Scott 的EMP作業樣本表。
這是您嘗試過的(但它不起作用):
SQL> select job, count(*)
2 from emp
3 order by 1, 2;
select job, count(*)
*
ERROR at line 1:
ORA-00937: not a single-group group function
這是有效的,但是 - 這不是你想要的:
SQL> select job, count(*)
2 from emp
3 group by job
4 order by 1, 2;
JOB COUNT(*)
--------- ----------
ANALYST 2
CLERK 4
MANAGER 3
PRESIDENT 1
SALESMAN 4
這就是您想要的(并且有效),但是 - 看起來并不漂亮:
SQL> select e.job,
2 (select count(*) from emp a where a.job = e.job) cnt
3 from emp e
4 order by 1, 2;
JOB CNT
--------- ----------
ANALYST 2
ANALYST 2
CLERK 4
CLERK 4
CLERK 4
CLERK 4
MANAGER 3
MANAGER 3
MANAGER 3
PRESIDENT 1
SALESMAN 4
SALESMAN 4
SALESMAN 4
SALESMAN 4
14 rows selected.
對您來說好訊息 -以分析形式使用count函式:
SQL> select job, count(*) over (partition by job order by null) cnt
2 from emp
3 order by 1, 2;
JOB CNT
--------- ----------
ANALYST 2
ANALYST 2
CLERK 4
CLERK 4
CLERK 4
CLERK 4
MANAGER 3
MANAGER 3
MANAGER 3
PRESIDENT 1
SALESMAN 4
SALESMAN 4
SALESMAN 4
SALESMAN 4
14 rows selected.
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442066.html
下一篇:如何根據日期PIVOT列
