Как получить количество столбцов - PullRequest
0 голосов
/ 12 сентября 2018

Я довольно новичок в оракуле и пытаюсь выяснить, как получить количество портов для каждого поставщика, которое возвращает мой запрос.

select distinct
  count(pi.port), pi.RACK, pi.SHELF, pi.SLOT, pi.PORT, pi.BROADBAND_CIRCUIT_ID, d.DSLAM, d.VENDOR, trim(d.model) as model, 
from
  table1 pi,
  table2 d,
  table3c
where
  pi.id = d.id and
  pi.circuit_id = c.circuit_id 
  and ((trim(d.model) not in ('TA5000','TA5004','TA5006','TA1248','TA1248V')) 
or (  (trim(d.model) not in ('C7','E7') or trim(d.model) not like '%E3-48CR2%' or trim(d.model) not like '%E3-48R2%') ) )
order by d.VENDOR

Когда я пробовал считать (pi.port), я получаю ORA-00937: не групповую функцию для одной группы. Как я могу получить количество портов, заказанных поставщиком?

1 Ответ

0 голосов
/ 12 сентября 2018

Все столбцы из SELECT, которые не агрегированы, должны быть частью предложения GROUP BY.

Из-за этого вам не нужно DISTINCT, потому что GROUP BY все равно будет возвращать различные значения.

В вашем запросе это будет

select 
  count(pi.port), 
  pi.RACK, pi.SHELF, pi.SLOT, pi.PORT, pi.BROADBAND_CIRCUIT_ID,   --> put all those
  d.DSLAM, d.VENDOR, trim(d.model)                                --> into GROUP BY
from ...
group by 
  pi.RACK, pi.SHELF, pi.SLOT, pi.PORT, pi.BROADBAND_CIRCUIT_ID, 
  d.DSLAM, d.VENDOR, trim(d.model)

[РЕДАКТИРОВАТЬ, чтобы показать, что такая GROUP BY действительно работает]

Данные на самом деле не имеют значения; Мне было лень создавать умнее тестовый пример (так как вы тоже не против опубликовать свой собственный). Это просто, чтобы показать, что запрос не вызывает ошибку, которую вы сказали, что это будет.

SQL> with
  2  table1 (id, port, rack, shelf, slot, broadband_circuit_id, circuit_id) as
  3    (select 1, 1, 1, 1, 1, 1, 1 from dual),
  4  table2 (id, model, vendor, dslam) as
  5    (select 1, 1, 1, 1 from dual),
  6  table3 (circuit_id) as
  7    (select 1 from dual)
  8  -- query goes here
  9  select
 10    count(pi.port) cnt,
 11    pi.RACK, pi.SHELF, pi.SLOT, pi.PORT, pi.BROADBAND_CIRCUIT_ID,   
 12    d.DSLAM, d.VENDOR, trim(d.model)
 13  -- your FROM clause
 14  from
 15    table1 pi,
 16    table2 d,
 17    table3 c
 18  where
 19    pi.id = d.id and
 20    pi.circuit_id = c.circuit_id
 21    and ((trim(d.model) not in ('TA5000','TA5004','TA5006','TA1248','TA1248V'))
 22  or (  (trim(d.model) not in ('C7','E7') or trim(d.model) not like '%E3-48CR2%' or trim(d.model)
 not like '%E3-48R2%') ) )
 23  -- my GROUP BY clause
 24  group by
 25    pi.RACK, pi.SHELF, pi.SLOT, pi.PORT, pi.BROADBAND_CIRCUIT_ID,
 26    d.DSLAM, d.VENDOR, trim(d.model)
 27  order by d.VENDOR;

       CNT       RACK      SHELF       SLOT       PORT BROADBAND_CIRCUIT_ID      DSLAM     VENDOR T
---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- -
         1          1          1          1          1                    1          1          1 1

SQL>
...