2013-03-07 97 views
0

我有以下SQL代码:聚合函数的别名错误

SELECT ACTIVITY_TYPE, COUNT(EVENT_ID) as etv, SUM(etv) as etva, AVG(etva) 
FROM ACTIVITIES, "EVENTS" 
WHERE ACTIVITIES.ACTIVITY_ID="EVENTS".ACTIVITY_ID 
GROUP BY ACTIVITY_TYPE; 

这是一个试图回答这样一个问题:

d) A query that provides management information on take up of the various types of activities on offer. For each type of activity, the query should show the total number of individuals who took that type of activity and the average number of individuals taking each type of activity.

不幸的是我得到以下错误:

ORA-00904: "ETVA": invalid identifier 

任何帮助将是伟大的!

编辑:

SELECT ACTIVITY_TYPE, COUNT(EVENT_ID), AVG(COUNT(EVENT_ID)) 
FROM ACTIVITIES, "EVENTS" 
WHERE ACTIVITIES.ACTIVITY_ID="EVENTS".ACTIVITY_ID 
GROUP BY ACTIVITY_TYPE; 

这是新的查询现在我收到此错误:

ORA-00937: not a single-group group function 

表结构:

CREATE TABLE "GROUPS" (
    GROUP_ID NUMBER(4) NOT NULL CONSTRAINT GROUP_ID_PK PRIMARY KEY , 
    GROUP_NAME VARCHAR2(35) NULL, 
    GROUP_NUMBER_OF_MEMBERS NUMBER(3) NOT NULL , 
    GROUP_LEADER_ID NUMBER(4) NOT NULL 
); 

CREATE TABLE MEMBERS (
    MEMBER_ID NUMBER(4) NOT NULL CONSTRAINT MEMBER_ID_PK PRIMARY KEY , 
    MEMBER_SURNAME VARCHAR2(35) NOT NULL , 
    MEMBER_FIRST_NAME VARCHAR2(35) NOT NULL , 
    MEMBER_DOB DATE NOT NULL , 
    MEMBER_GENDER VARCHAR2(1) NOT NULL CONSTRAINT MEMBER_GENDER_CHECK CHECK (MEMBER_GENDER IN ('M' , 'F')), 
    GROUP_ID NUMBER(4) NOT NULL, 
    CONSTRAINT GROUP_ID_FK_MEMBER FOREIGN KEY (GROUP_ID) REFERENCES "GROUPS"(GROUP_ID) 
); 

CREATE TABLE CHALETS (
    CHALET_NO NUMBER(4) NOT NULL CONSTRAINT CHALET_ID_PK PRIMARY KEY , 
    CHALET_NAME VARCHAR2(35) NOT NULL, 
    CHALET_CAPACITY NUMBER(2) NOT NULL, 
    CHALET_RATE NUMBER(6 , 2) NOT NULL 
); 

CREATE TABLE SUPERVISORS (
    SUPERVISOR_ID NUMBER (4) NOT NULL CONSTRAINT SUPERVISOR_ID_PK PRIMARY KEY , 
    SUPERVISOR_SURNAME VARCHAR2(35) NOT NULL , 
    SUPERVISOR_FIRST_NAME VARCHAR2(35) NOT NULL , 
    SUPERVISOR_MOBILE_NUMBER VARCHAR2(11) NOT NULL 
); 

CREATE TABLE ACTIVITIES (
    ACTIVITY_ID NUMBER (4) NOT NULL CONSTRAINT ACTIVITY_ID_PK PRIMARY KEY , 
    ACTIVITY_TYPE VARCHAR (35) NOT NULL , 
    ACTIVITY_TITLE VARCHAR2(35) NOT NULL 
); 

CREATE TABLE BOOKINGS (
    BOOKING_ID NUMBER(4) NOT NULL CONSTRAINT BOOKING_ID_PK PRIMARY KEY , 
    GROUP_ID NUMBER(4) NOT NULL , 
    CHALET_ID NUMBER(4) NOT NULL , 
    BOOKING_START_DATE DATE NOT NULL , 
    BOOKING_END_DATE DATE NOT NULL , 
    CONSTRAINT GROUP_ID_FK_BOOKING FOREIGN KEY (GROUP_ID) REFERENCES GROUPS(GROUP_ID) , 
    CONSTRAINT CHALET_ID_FK_BOOKING FOREIGN KEY (CHALET_ID) REFERENCES CHALETS(CHALET_NO) 
); 

CREATE TABLE "EVENTS" (
    EVENT_ID NUMBER (4) NOT NULL CONSTRAINT EVENT_ID_PK PRIMARY KEY , 
    MEMBER_ID NUMBER (4) NOT NULL , 
    SUPERVISOR_ID NUMBER (4) NOT NULL , 
    ACTIVITY_ID NUMBER (4) NOT NULL , 
    EVENT_COMMENTS VARCHAR2(500) , 
    EVENT_DATE DATE NOT NULL , 
    EVENT_TIME_SLOT VARCHAR2(2) NOT NULL , 
    CONSTRAINT MEMBER_ID_FK_EVENT FOREIGN KEY (MEMBER_ID) REFERENCES MEMBERS(MEMBER_ID) , 
    CONSTRAINT SUPERVISOR_ID_FK_EVENT FOREIGN KEY (SUPERVISOR_ID) REFERENCES SUPERVISORS(SUPERVISOR_ID) , 
    CONSTRAINT ACTIVITY_ID_FK_EVENT FOREIGN KEY (ACTIVITY_ID) REFERENCES ACTIVITIES(ACTIVITY_ID) 
); 


ALTER TABLE "GROUPS" ADD CONSTRAINT MEMBER_ID_FK_GROUP_LEADER FOREIGN KEY (GROUP_LEADER_ID) REFERENCES MEMBERS(MEMBER_ID); 
+1

您的意思是'AVG(ETV)'代替AVG(etva)'? – codingbiz 2013-03-07 22:20:44

回答

0

查询中的etv和etva不是列,而是别名。你不能选择它们。 要选择他们按照这个和您的查询/列给出有意义的别名:

SELECT ACTIVITY_TYPE, count_etv, sum_etva, AVG(sum_etva) avg_atva 
    FROM 
    (
    SELECT ACTIVITY_TYPE, count_etv, SUM(count_etv) as sum_etva 
    FROM 
    (
    SELECT ACTIVITY_TYPE, COUNT(EVENT_ID) as count_etv 
     --, SUM(etv) as etva, AVG(etva) -- NOT columns you cannot select them 
    FROM ACTIVITIES, "EVENTS" 
    WHERE ACTIVITIES.ACTIVITY_ID="EVENTS".ACTIVITY_ID 
    GROUP BY ACTIVITY_TYPE 
    ) 
    GROUP BY ACTIVITY_TYPE, count_etv 
) 
GROUP BY ACTIVITY_TYPE, count_etv, sum_etva 
/

第二次查询 - 清洁,更具可读性...:

SELECT ACTIVITY_TYPE -- optional 
     , total_events -- optional 
    , AVG(total_events) avg_events 
    FROM 
    (
    SELECT ACTIVITY_TYPE 
     , COUNT(EVENT_ID) total_events 
    FROM ACTIVITIES, "EVENTS" 
    WHERE ACTIVITIES.ACTIVITY_ID="EVENTS".ACTIVITY_ID 
    GROUP BY ACTIVITY_TYPE 
    ) 
    GROUP BY ACTIVITY_TYPE, total_events 
/
1

问题是与AVG(etva)

在定义它的相同SELECT list中不能使用别名

更大的问题是,您不能在值(SUM())上使用聚合函数AVG

根据任务描述,您需要AVG(etv),因为它已经在上面通过编码商标指出。

继续发布新查询后。

我的理解是,EVENTS将连接件与他们参加活动的记录。

如果是这样,你需要JOINEVENTSsub-query计算计数成员EVENTS与“活动”先手活动标题。

+0

谢谢请参阅我的更新:) – 2013-03-07 22:38:54

+0

@David Passmore - 完全相同的答案:不能在值('COUNT()')上使用聚合函数('AVG')。 – 2013-03-07 22:42:50

+0

@ PM_77-1好的,你会怎么建议我去做这件事? – 2013-03-07 22:44:42

0

据我了解张贴结构。每个活动都是唯一的,每个活动只参加一个会员。因此,您无法统计每个活动的平均会员数量,因为这只是活动与特定活动的总和。只有参与者的总人数是可能的:

SELECT ACTIVITY_TYPE, COUNT(EVENT_ID) 
FROM ACTIVITIES, "EVENTS" 
WHERE ACTIVITIES.ACTIVITY_ID="EVENTS".ACTIVITY_ID 
GROUP BY ACTIVITY_TYPE; 

纠正我,如果我错了。

+0

不完全,一个成员可以参加更多的一个活动,并且不止一个成员可以参与一个活动。事件表是为了防止多对多的关系。 – 2013-03-07 23:13:13

+0

你说:“所以你不能计算每个活动会员的平均数量,因为只是活动与特定活动的总和”,但是如果你总结了COUNT的AVG,那么它会起作用,不是吗? – 2013-03-07 23:17:46

+0

嗯。假设我们的查询结果(Activity1,15),(Activity2,4)。你如何计算每个活动的平均值? – www 2013-03-07 23:21:08