Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL逻辑和聚合问题_Sql_Oracle - Fatal编程技术网

SQL逻辑和聚合问题

SQL逻辑和聚合问题,sql,oracle,Sql,Oracle,我需要在SQL中解决以下问题: d) 一种查询,提供有关所提供的各种类型活动的接受情况的管理信息。对于每种类型的活动,查询应显示参加该类型活动的总人数以及参加每种类型活动的平均人数 这是我的桌子: CREATE TABLE accommodations ( chalet_number int PRIMARY KEY, chalet_name varchar(40) NOT NULL, no_it_sleeps number(2) NOT NULL, indivppw number(4) NOT

我需要在SQL中解决以下问题:

d) 一种查询,提供有关所提供的各种类型活动的接受情况的管理信息。对于每种类型的活动,查询应显示参加该类型活动的总人数以及参加每种类型活动的平均人数

这是我的桌子:

CREATE TABLE accommodations
(
chalet_number int PRIMARY KEY,
chalet_name varchar(40) NOT NULL,
no_it_sleeps number(2) NOT NULL,
indivppw number(4) NOT NULL
)


CREATE TABLE supervisors
(
supervisor_number int PRIMARY KEY,
supervisor_forename varchar(30) NOT NULL,
supervisor_surname varchar(30) NOT NULL,
mobile_number varchar(11) NOT NULL
)



CREATE TABLE visitors
(
visitor_ID int PRIMARY KEY,
group_ID int NOT NULL,
forename varchar(20) NOT NULL,
surname varchar(20) NOT NULL,
dob date NOT NULL,
gender varchar(1) NOT NULL
)


CREATE TABLE activities
(
activity_code varchar(10) PRIMARY KEY,
activity_title varchar(20) NOT NULL,
"type" varchar(20) NOT NULL
)


CREATE TABLE "groups"
(
group_ID int PRIMARY KEY,
group_leader varchar(20) NOT NULL,
group_name varchar(30)
number_in_group number(2) NOT NULL
)


CREATE TABLE bookings
(
group_ID int NOT NULL,
start_date date NOT NULL,
chalet_number int NOT NULL,
no_in_chalet number(2) NOT NULL,
start_date date NOT NULL,
end_date date NOT NULL,
CONSTRAINT bookings_pk PRIMARY KEY(group_ID, chalet_number));


CREATE TABLE schedule
(
schedule_ID int PRIMARY KEY,
activity_code varchar(10) NOT NULL,
time_of_activity number(4,2) NOT NULL,
am_pm varchar(2) NOT NULL,
"date" date NOT NULL
)


CREATE TABLE activity_bookings
(
visitor_ID int NOT NULL,
schedule_ID int NOT NULL,
supervisor_number int NOT NULL,
comments varchar(200),
CONSTRAINT event_booking_pk PRIMARY KEY(visitor_ID, schedule_ID));





ALTER TABLE visitors
ADD FOREIGN KEY (group_ID)
REFERENCES "groups"(group_ID)

ALTER TABLE Schedule
ADD FOREIGN KEY (activity_code)
REFERENCES activities(activity_code)


ALTER TABLE bookings
ADD FOREIGN KEY (group_ID)
REFERENCES "groups"(group_ID)


ALTER TABLE bookings
ADD FOREIGN KEY (chalet_number)
REFERENCES accommodations(chalet_number)



ALTER TABLE activity_bookings
ADD FOREIGN KEY (visitor_ID)
REFERENCES visitors(visitor_ID)


ALTER TABLE activity_bookings
ADD FOREIGN KEY (schedule_ID)
REFERENCES schedule(schedule_ID)


ALTER TABLE activity_bookings
ADD FOREIGN KEY (supervisor_number)
REFERENCES supervisors(supervisor_number)
我有以下解决方案:

SELECT activities."type", 'overalltotal' AS OT, ('overalltotal' / 'activities') AS AVG
  FROM activities, schedule
  WHERE 'overalltotal' = (SELECT SUM(COUNT(schedule_ID))
        FROM activities, schedule
        WHERE schedule.activity_code = activities.activity_code
        GROUP BY activities."type"
        )
  AND 'activities' = (SELECT COUNT(DISTINCT activities."type")
        FROM activities
        )
  AND schedule.activity_code = activities.activity_code
GROUP BY activities."type";
我已经实现了示例数据和代码来检查上述变量:

SELECT SUM(COUNT(schedule_ID))
        FROM activities, schedule
        WHERE schedule.activity_code = activities.activity_code
        GROUP BY activities."type";
结果:20

结果:5

但是,在运行代码时:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    
*Action:
编辑:

使用Dave的代码,我有以下输出:

Snowboarding    15
sledding            19
Snowmobiling    6
Ice Skating         5
Skiing          24
我该怎么做问题的最后部分

以及参加每种活动的平均人数


在Oracle中,必须在列名周围使用双引号,而不是单引号。例如,
“总体”
。单引号用于文本字符串,这就是为什么会出现无效数字错误的原因

编辑:这可能是您要使用的查询类型:

SELECT activities."type", COUNT(*) AS total, COUNT(*)/(COUNT(*) OVER ()) AS "avg"
FROM activities a
JOIN schedule s ON a.activity_code=s.activity_code
JOIN activity_bookings ab ON s.schedule_ID=ab.schedule_ID
GROUP BY activities."type";

基本上,因为每个活动预订都有一个访客id,所以我们希望获得每个活动的所有活动预订。我们必须按时间表去做。我们按活动类型对行进行分组,并计算每种类型的活动预订量。

没有运气更改它们,我得到
ORA-00904:“活动”:无效标识符00904。00000-“%s:无效标识符”*原因:*操作:第8行第6列出现错误
这可能是因为您已经有一个名为
活动的表
。表和列的名称不能相同。仔细查看您的查询,它还有一些其他问题。我需要再考虑一下重写它。我相信David正在尝试MySQL风格的在线作业。是的,这正是我想知道的。@Dave_Johnson谢谢我尝试更改变量,但仍然显示为Invalid,但您可以同时安排多人。我想这就是为什么会有那么多人参加活动的原因。
SELECT activities."type", COUNT(*) AS total, COUNT(*)/(COUNT(*) OVER ()) AS "avg"
FROM activities a
JOIN schedule s ON a.activity_code=s.activity_code
JOIN activity_bookings ab ON s.schedule_ID=ab.schedule_ID
GROUP BY activities."type";