2016-09-04 1 views
1

Ich mache einige Revision auf Uni-Arbeit, wo es sich um eine Data Warehousing-Übung für ein einfaches Szenario handelt, das Data Warehouse wird gebaut, um die Anzahl der zu berechnen Mal benutze Studenten ein Computerlabor basierend auf verschiedenen Zeiträumen, Semestern und Majors. Als Referenz ist unser Data Warehouse von vier Originaltische gebaut, die sind:'nicht eine einzige Gruppe-Gruppenfunktion' Fehler in SQL

  • USELOG (log_date, log_time, STUDENT_ID, Act)
  • Student (STUDENT_ID, Sex, Voll-/Teil, Typ, CLASS_ID, Major_Code)
  • Dur (Major_name, Major_code) Bekannte (Major_name, Major_code)
  • Klasse (Class_description, CLASS_ID)

ich zwei Fehler, den ich um arbeitete von (glaube ich) und ein anderes ist Eine Gruppe aus Versehen, die ich scheinbar nicht lösen kann, da ich die Lösungen des Lehrers habe und wir ähnliche Gruppierungen haben, aber ich denke, es gibt etwas anderes darüber, wie ich die Aufgabe erledigt habe.

Auf jeden Fall ist mein Code wie folgt:

Create table Period_DIM (
PeriodID number, 
PeriodDesc varchar2(15), 
begin_time date, 
end_time date); 

Create Table Semester_DIM(
SemesterID number, 
Semester_Desc varchar2(15), 
start_date date, 
end_date date); 

Create Table Major_DIM as Select * from major; 

Create Table class_dim as select * from class; 

--Populate Period_Dim 
Insert Into Period_DIM Values(1, 'Morning', To_date('06:01', 'HH24:MI'), To_date('12:00', 'HH24:MI')); 
Insert Into Period_DIM Values(2, 'Afternoon', To_date('12:01', 'HH24:MI'), To_date('18:00', 'HH24:MI')); 
Insert Into Period_DIM Values(3, 'Evening', To_date('18:01', 'HH24:MI'), To_date('06:00', 'HH24:MI')); 

--Populate Semester_DIM 
Insert Into Semester_DIM Values (1, 'Semester 1', To_date('01-Jan', 'DD-MON'), To_date('15-JUL', 'DD-MON')); 
Insert Into Semester_DIM Values (2, 'Semester 2', To_date('16-Jul', 'DD-MON'), To_date('31-DEC', 'DD-MON')); 

--Create Temp Fact Table 
Create table tempfacttable As Select u.LOG_DATE, u.LOG_TIME, u.STUDENT_ID, s.CLASS_ID, s.MAJOR_CODE 
From Uselog u, student s 
where u.STUDENT_ID = s.STUDENT_ID; 

--Add a timeID to each row in the table because the data doesn't originally have them 
alter table tempfacttable add (timeid number); 
update tempfacttable 
set timeid = 1 
where to_char(log_time, 'HH24:MI') >= '06:01' 
and to_char(log_time, 'HH24:MI') <= '12:00'; 

update tempfacttable 
set timeid = 2 
where to_char(log_time, 'HH24:MI') >= '12:01' 
and to_char(log_time, 'HH24:MI') <= '18:00'; 

--Use OR in this case 
update tempfacttable 
set timeid = 3 
where to_char(log_time, 'HH24:MI') >= '18:00'or to_char (log_time, 'HH24:MI') <= '06:00'; 

--Add a semester ID based on the date in the tempfact cause its not contained in the Dimensions 
alter table tempfacttable add (semid varchar2(10)); 
update tempfacttable 
set semid= 'S1' 
where to_char(log_date, 'MMDD') >= '0101' 
and to_char(log_date, 'MMDD') <= '0715'; 

update tempfacttable 
set semid = 'S2' 
where to_char(log_date, 'MMDD') >= '0716' 
and to_char(log_date, 'MMDD') <= '1231'; 

--Create the Fact Table 
Create table factTable as 
select t.SEMID, t.TIMEID, t.MAJOR_CODE, t.CLASS_ID, count(t.student_id) as total_usage 
From tempfacttable t 
group by t.semid, t.timeid, t.class_id, t.major_code; 

select total_usage from tempfacttable; --returns error saying total_usage is an invalid operator 

--Usage for time period by major and by student's class 
--Select t.timeid, p.perioddesc, m.major_code, m.major_name, c.class_id, c.class_description, sum(t.total_usage) as usage_numbers 
--Previous line returns error because of t.total_usage, workaround is in the next line 
Select t.timeid, p.PERIODDESC, m.MAJOR_CODE, m.MAJOR_NAME, c.CLASS_ID, c.CLASS_DESCRIPTION, sum(count(t.student_id)) as usage_numbers 
from tempfacttable t, period_dim p, class_dim c, major_dim m 
where t.timeid = p.PERIODID 
and t.major_code = m.major_code 
group by t.timeid, p.PERIODDESC, t.major_code, m.major_name, t.class_id, c.class_description; 

Ich kann nicht scheinen, zu arbeiten, ich erhalte eine Fehlermeldung besagt, dass ‚nicht eine einzige Gruppe-Gruppenfunktion‘. Ich würde wirklich einige Hilfe mit diesem und mit dem Grund schätzen, warum ich mich nicht auf total_usage beziehen kann, obwohl wenn ich * aus der Tabelle wähle, die es mit den restlichen Attributen angezeigt wird. Vielen Dank

+1

gerade ins Auge Balling Ihre 'SELECT' Erklärung am unteren Rande ... Sie' GROUP BY' Anweisung sucht für 't.major_code' (t), aber du wählst' m.MAJOR_CODE' (m). Ich weiß, dass Sie eine Klausel haben, die besagt, dass sie identisch sein sollten - aber Sie möchten die Daten, die Sie "AUSWÄHLEN", im Allgemeinen "GRUPPIEREN". Ich frage mich, ob Oracle sich darüber aufregt? – doublesidedstickytape

Antwort

1

Ich denke, es ist, weil Sie keine total_usage Spalte innerhalb Ihrer tempfacttable definiert haben. Sie haben jedoch eine Spalte total_usage in Ihrer factTable Tabelle

diesen Versuchen Sie stattdessen:

select total_usage from factTable; 
Verwandte Themen