2013-11-02 30 views
-1

我是SQL新手,正在執行以下查詢。我試圖從表emp中檢索完整的數據,並計算每個組中的記錄數,但結果是錯誤。在oracle中使用*運算符與按功能組合SQL

邏輯是否正在使用這裏請指引我正確的或錯誤的 既不是我

SELECT * 
, COUNT(*) 
FROM EMP 
GROUP BY EMPNO,ENAME,JOB,MGR,HIRE DATE,SAL,COMM,DEPT NO; 

select * 
, count(*) 
from emp 
group by deptno 

下面的查詢(我用DEPTNO這裏,是因爲它在這個表中的第一列)

+1

嚴格實施方案,如Oracle 8i中,集合函數(如'MIN'或'MAX')必須用於在沒有指定每一列中的' GROUP BY'條款。 '*'不起作用,因此你必須拼出每一列有些用例如'MAX()'。 – 2013-11-02 13:18:36

+0

「*統計每組中的記錄數*」 - 您要計算哪組? –

回答

1

當您使用GROUP BY,然後在SELECT中,您只能使用來自GROUP BY的行和聚合函數(例如sum,count等)。
例如這裏

select 
    emp.* , count(*) -- it's illegal 
from 
    emp 
group by 
    deptno 

您可以通過他們的一些SELECT條款

select 
    deptno, count(*) -- it is legal 
from 
    emp 
group by 
    deptno 
+0

感謝您的澄清llya – keshav

1

是沒有意義的選擇所有列,和組只使用deptno和聚合功能,因爲它會對於未分組的列顯示什麼內容是不確定的 - 對於這些,您應該忽略它們(如果您不需要它們),或者使用聚合函數(如MIN()MAX()等)可以這樣做:

SELECT  EMPNO, 
      ENAME, 
      JOB, 
      MGR, 
      "HIRE DATE", 
      SAL, 
      COMM, 
      "DEPT NO", 
      COUNT(*) 

FROM  EMP 

GROUP BY EMPNO, 
      ENAME, 
      JOB, 
      MGR, 
      "HIRE DATE", 
      SAL, 
      COMM, 
      "DEPT NO" 
+0

''['和']'在SQL(標準SQL和Oracle)中是非法的。要使用帶引號的標識符,您必須使用雙引號'「DEPT NO」' –

+0

@a_horse_with_no_name當時未用[oracle]標記,但已編輯:/ –

+0

但它標有'SQL',表示答案應該符合標準的SQL。 SQL不是**特定的DBMS產品。這是一種(標準化的)*查詢語言* –

0

當使用聚合和GROUP BY,您group by子句必須包括所有非聚合列,只有從您的SELECT子句的非集合列。因此,它必須是這樣的:

select field1, field2, etc, count(*) records 
from etc 
group by field1, field2 

你不應該使用select *,但如果這樣做,這句法可能會奏效,也可能不。你將不得不嘗試。

select t.*, count(*) records 
from yourtable t etc 
group by t.* 

顯然MySQL允許你不匹配by子句的選擇和組等領域,但似乎打開大門,非常奇怪的結果。但是,我不使用MySQL,所以我實際上不知道。

某些數據庫允許您在group by子句中使用別名。像這樣:

select field1 f1, count(*) records 
from etc 
group by f1 

從邏輯的角度來看,它取決於你正在嘗試。

+0

由於丹建議我試着下面的查詢與一些manuplation SELECT EMP。*,COUNT(*)從EMP組的作業,MGR,HIREDATE,SAL,COMM,EMPNO,ENAME,DEPTNO; 但這個查詢給了我所有記錄的結果,這和使用 select * from emp; 上面的查詢應該按工作分組嗎? 請幫我理解這一點 – keshav

1
SELECT 
    t.*, 
    COUNT(*) over (partition by EMPNO,ENAME,JOB,MGR,HIRE_DATE,SAL,COMM,DEPT_NO) as cnt 
FROM EMP t 
1

要檢索的所有列,仍然可以得到基於特定的組數,您可以使用窗口函數(甲骨文稱他們爲「分析功能」):

你沒有告訴我們其中「組「你真的想,但是這應該給你一個想法:

SELECT emp.*, 
     count(*) over (partition by dept_no) as employees_per_department, 
     count(*) over (partition by mgr) as employees_per_manager, 
     count(*) over() as total_nr_of_employees 
FROM EMP