2013-11-17 3 views
0

Я хочу сделать SQL-запрос, который находит pname деталей, которые наименее повторяются в supplier_parts_shipment.Функция SQL group вложен слишком глубоко

Таблица 1 поставщик (SNO, SNAME, город)

1, ahmad, jeddah 
2,kaled,med 
3,njwa,med 

Таблица 2 части (ПНО, PNAME, цвет)

1, laptop, red 
2,keybord,blue 

Таблица 3 supplier_parts_shipment (shno, Сно, PNO, дата)

1,1,1,2014 
2,2,1,2014 
3,3,2,2014 

Я пытался что-то вроде этого:

SELECT pname 
     , min(count(pno)) 
    FROM parts 
    WHERE pno IN (SELECT pno 
        FROM supplier_parts_shipment 
        group by 
         pname 
       HAVING min(count(pno)) 
       ) 
SQL>/
pno IN(SELECT pno FROM supplier_parts_shipment group by pname HAVING min(count(pno)))) 
                     * 
ERROR at line 2: 
ORA-00935: group function is nested too deeply 
+0

кто-нибудь помочь мне, пожалуйста, – user3001575

ответ

0
min(count(pno)) 

не имеет смысла. поэтому вы получаете ошибку. попробуйте:

select parts.pname 
    , subse.c 
    from (select pno 
      , dense_rank() over (order by c asc) r 
      , c 
      from (select pno 
        , count(pno) as c 
        from supplier_parts_shipment 
       group by 
         pno 
       ) 
     ) subse 
inner join parts 
    on (parts.pno = subse.pno) 
where subse.r = 1 

в сокровенном выберите отсчитывает supplier_parts_shipment для ПНА, второго уровня находит ПНО, который имеет наималейший отсчет от сокровенного. внешний выбор затем соединяет pname от частей и фильтров с тем, который имеет наименьшее количество повторений.

+0

ОШИБКА в строке 4: ORA-00979: не выражение GROUP BY – user3001575

+0

Я исправил и протестировал его. он работает сейчас и дает только части с наименьшим количеством отправленных деталей. –

0

Я бы пошла об этом по-другому.

Сначала создайте запрос, который показывает количество отправок по pname, упорядоченным по возрастанию. Используйте это как подзапрос и выберите первый.

SELECT * FROM (
    SELECT COUNT(sps.pno), p.pname 
    FROM supplier_parts_shipment sps 
    JOIN parts p on sps.pno = p.pno 
    GROUP BY pname 
    ORDER BY COUNT(sps.pno) ASC) 
WHERE ROWNUM = 1 
+0

Привет, обратите внимание на теги ... Я скорректировал ваш запрос, чтобы он теперь работал. – Ben

+0

@Ben Спасибо за исправление. Забыли Oracle не позволяет 'TOP' и такой – tyh

+0

SQL> SELECT * FROM ( 2 SELECT COUNT (ПНО), p.pname 3 ОТ supplier_parts_shipment 4 соединения деталей на р sps.pno = рр 5 ГРУППА ПО PNAME 6 ORDER BY COUNT (pno) ASC) 7 WHERE ROWNUM = 1; ORDER BY COUNT (pno) ASC) * ОШИБКА по строке 6: ORA-00918: столбец неопределенно определен – user3001575

0

Если есть несколько частей, которые являются наименее часто и вы хотите, чтобы все из них потом:

WITH pno_frequencies AS (
    SELECT pno, 
     COUNT(1) AS pno_cnt 
    FROM supplier_parts_shipment 
    GROUP BY pno 
), 
least_frequent_pnos AS (
    SELECT pno 
    FROM pno_frequencies 
    WHERE pno_cnt = (SELECT MIN(pno_cnt) FROM pno_frequencies) 
) 
SELECT pname 
FROM parts p 
WHERE EXISTS (SELECT 1 
       FROM least_frequent_pnos f 
       WHERE p.pno = f.pno 
      ); 

Если вы хотите только одну детали, независимо от того, есть несколько частей с одной и той же минимальной частотой затем:

WITH pno_frequencies AS (
    SELECT pno, 
     COUNT(1) AS pno_cnt 
    FROM supplier_parts_shipment 
    GROUP BY pno 
    ORDER BY pno_cnt ASC 
), 
least_frequent_pno AS (
    SELECT pno 
    FROM pno_frequencies 
    WHERE ROWNUM = 1 
) 
SELECT pname 
FROM parts p 
WHERE EXISTS (SELECT 1 
       FROM least_frequent_pno f 
       WHERE p.pno = f.pno 
      ); 

SQLFIDDLE

Смежные вопросы