Oracle 9.i SELECT FROM 两条table 三条记录到结果一条记录

Oracle 9.i SELECT FROM two table and three record to result one record

我有以下查询(查询 1):

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

查询 1 的结果: click for preview

(查询 2):

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

查询2的结果: click for preview

(查询 3):

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

查询3的结果: click for preview

到目前为止,我有 运行 这个查询:

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: not a single-group group function

来自查询的完整记录 (*):

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

click for preview

(2) and (3) 

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

click for preview

我的问题

如何让3次查询的结果变成这样的输出:

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

也许我遗漏了什么,但您对 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

我之前回答的更简单替代方法:

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

您可以尝试使用连接表作为

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