Oracle 9.i ВЫБРАТЬ ИЗ двух таблиц и трех записей для получения одной записи - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть следующие запросы (запрос 1):

SELECT AVG(a.nnilai)*75/100 
FROM trangketmhs a WHERE cthajar='20172018' AND a.csmt='E' AND a.kddos='00084'

Результат запроса 1: щелкните для предварительного просмотра

(запрос 2):

    SELECT t.nbobot FROM TRNILAIKINERJA t 
WHERE t.ckddos='00084' AND t.cthajar='20172018' AND t.csmt='E' AND t.ckdnilai='TLT'

Результат запроса 2: щелкните для предварительного просмотра

(запрос 3):

SELECT p.nbobot FROM TRNILAIKINERJA p 
WHERE p.ckddos='00084' AND p.cthajar='20172018' AND p.csmt='E' AND p.ckdnilai='PKM'

Результат запроса 3: нажмите для предварительного просмотра

Пока я выполнил этот запрос:

SELECT AVG(a.nnilai)*75/100,
(SELECT t.nbobot FROM TRNILAIKINERJA t WHERE t.ckddos='00084' AND t.cthajar='20172018' AND t.csmt='E' AND t.ckdnilai='TLT'),
(SELECT p.nbobot FROM TRNILAIKINERJA p WHERE p.ckddos='00084' AND p.cthajar='20172018' AND p.csmt='E' AND p.ckdnilai='PKM')
 FROM trangketmhs a WHERE cthajar='20172018' AND a.csmt='E' AND a.kddos='00084'

Но это результат:

ORA-00937: не групповая функция для одной группы

Полная запись (*) из запросов:

SELECT * 
FROM trangketmhs a 
WHERE cthajar='20172018' 
  AND a.csmt='E' 
  AND a.kddos='00084'

нажмите для предварительного просмотра

(2) and (3) 

SELECT * 
FROM TRNILAIKINERJA t 
WHERE t.ckddos='00084' 
  AND t.cthajar='20172018' 
  AND t.csmt='E' 

нажмите для предварительного просмотра

Мой вопрос

Как сделать так, чтобы результат 3 запросов стал таким:

| AVG(a.nnilai)*75/100  | NBOBOT1  | NBOBOT2 |
|-----------------------|----------|---------|
|     2,58818181818182  |     0.6  |     0.4 |

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Более простая альтернатива моему предыдущему ответу:

SELECT a.the_average,
    ,(SELECT t.nbobot FROM TRNILAIKINERJA t WHERE t.ckddos='00084' AND t.cthajar='20172018' AND t.csmt='E' AND t.ckdnilai='TLT') nbobot1
    ,(SELECT p.nbobot FROM TRNILAIKINERJA p WHERE p.ckddos='00084' AND p.cthajar='20172018' AND p.csmt='E' AND p.ckdnilai='PKM') nbobot2
FROM (
  SELECT AVG(a.nnilai)*75/100 the_average
    FROM trangketmhs a WHERE cthajar='20172018' AND a.csmt='E' AND a.kddos='00084'
) a
0 голосов
/ 03 декабря 2018

Вы можете попытаться использовать объединение таблиц как

create table trangketmhs(nnilai float,cthajar varchar2(8),csmt varchar2(1),kddos varchar2(8));
insert into trangketmhs values(4.001818181818186,'20172018','E','00084');
insert into trangketmhs values(2.9              ,'20172018','E','00084');

create table trnilaikinerja( ckddos varchar2(8), cthajar varchar2(8), csmt varchar2(1), ckdnilai varchar2(3));
insert into trnilaikinerjavalues('00084','20172018','E','TLT');
insert into trnilaikinerjavalues('00084','20172018','E','PKM');

select avg(t1.nnilai)*75/100 avg_nnilai,
       max(decode(t2.ckdnilai,'TLT',.6)) nbobot1,
       max(decode(t2.ckdnilai,'TLT',.4)) nbobot2 
  from trangketmhs t1
  join trnilaikinerja t2 
    on t1.cthajar = t2.cthajar
   and t1.csmt = t2.csmt
   and t1.kddos = t2.ckddos;

   AVG_NNILAI      NBOBOT1  NBOBOT2
----------------   -------  --------
2,58818181818182     0,6      0,4
0 голосов
/ 03 декабря 2018

Может быть, я что-то упустил, но, похоже, нет никакой связи между вашим запросом на trangketmhs (= a) и запросами на TRNILAIKINERJA (t и p).

Так что я думаю, вы могли бы сделать что-то вроде этого:

SELECT a.the_average, t.nbobot1, p.nbobot2 
FROM (SELECT AVG(a.nnilai)*75/100 the_average
  FROM trangketmhs a 
  WHERE a.cthajar='20172018' 
  AND a.csmt='E' 
  AND a.kddos='00084') a
CROSS JOIN (SELECT t.nbobot nbobot1 
  FROM TRNILAIKINERJA t 
  WHERE t.ckddos='00084' 
  AND t.cthajar='20172018' 
  AND t.csmt='E' 
  AND t.ckdnilai='TLT') t
CROSS JOIN (SELECT p.nbobot nbobot2 
  FROM TRNILAIKINERJA p 
  WHERE p.ckddos='00084' 
  AND p.cthajar='20172018' 
  AND p.csmt='E' 
  AND p.ckdnilai='PKM') p
...