2014-10-19 4 views
0

У меня возникла эта проблема. Когда я попытался обобщить минимальное количество продуктов нации, и это не сработало. У меня есть 2 таблицы ниже ПРОДУКТА:SQL: Как получить мин. Количество?

ID|NAME |NaID|Qty 
------------------- 
01|Fruit|JP |50 
02|MEAT |AUS |10 
03|MANGA|JP |80 
04|BOOK |AUS |8 

НАЦИЯ:

NaID |NAME 
------------------- 
AUS |Australia 
JP |Japan  

Я хочу, чтобы мой результат так:

ID|NAME |Name|minQty 
------------------- 
01|Fruit|JP |50  
04|BOOK |AUS |8 

и я использовал:

select p.id,p.name, p.NaID,n.name,min(P.Qty)as minQty 
from Product p,Nation n 
where p.NaID=n.NaID 
group by p.id,p.name, p.NaID,n.name,p.Qty 

d i получил это (T_T):

ID|NAME |NaID|minQty 
------------------- 
01|Fruit|JP |50 
02|MEAT |AUS |10 
03|MANGA|JP |80 
04|BOOK |AUS |8 

Пожалуйста, помогите мне помочь? Я думаю, что сейчас я плохо разбираюсь в SQL.

+0

Какая СУБД вы действительно используете? Вы отметили свой вопрос множеством разных, и ответ может зависеть от возможностей, доступных в каждом из них. –

+1

удалить p.Qty из группы? – SMA

+0

Я использую SQL 2005 – Hanata

ответ

0

SQL Server 2005 поддерживает оконные функции, так что вы можете сделать что-то вроде этого:

select id, 
     name, 
     NaID, 
     name, 
     qty 
from (
    select p.id, 
     p.name, 
     p.NaID, 
     n.name, 
     min(P.Qty) over (partition by n.naid) as min_qty, 
     p.qty 
    from Product p 
    join Nation n on p.NaID=n.NaID 
) t 
where qty = min_qty; 

Если есть более чем одна страна с такой же минимальной стоимости, вы получите каждый из них. Если вы не хотите, что вам нужно использовать row_number()

select id, 
     name, 
     NaID, 
     name, 
     qty 
from (
    select p.id, 
     p.name, 
     p.NaID, 
     n.name, 
     row_number() over (partition by n.naid order by p.qty) as rn, 
     p.qty 
    from Product p 
    join Nation n on p.NaID = n.NaID 
) t 
where rn = 1; 

В вашем примере выход с только включает NAID но имя не нации, вы действительно не нужен соединение между product и nation.


(Там нет СУБД продукта под названием «SQL 2005». SQL просто (стандарт) для языка запросов. Продукт СУБД вы имеете в виду, называется Microsoft SQL сервером 2005. Или просто SQL Server 2005).

+0

Спасибо большое. Я сделал это. – Hanata

+0

Я сделал это с запросом ниже: выберите PID, PNAME, PNAME, min_qty из ( выберите p.id как PID, p.name как PNAME, n.name как Nname, мин (P. Qty) над (разбиение на n.naid) как min_qty, p.qty из продукта p соединение N на p.NaID = n.NaID ) t ) где qty = min_qty; – Hanata

+0

Извините, но я не знаю, как правильно ответить на этом форуме – Hanata

0

В Oracle вы можете использовать несколько методов. Вы можете использовать подзапросы и аналитические функции, но наиболее эффективным является использование агрегатных функций MIN и FIRST.

Ваши столы:

SQL> create table nation (naid,name) 
    2 as 
    3 select 'AUS', 'Australia' from dual union all 
    4 select 'JP', 'Japan' from dual 
    5/

Table created. 

SQL> create table product (id,name,naid,qty) 
    2 as 
    3 select '01', 'Fruit', 'JP', 50 from dual union all 
    4 select '02', 'MEAT', 'AUS', 10 from dual union all 
    5 select '03', 'MANGA', 'JP', 80 from dual union all 
    6 select '04', 'BOOK', 'AUS', 8 from dual 
    7/

Table created. 

Запрос:

SQL> select max(p.id) keep (dense_rank first order by p.qty) id 
    2  , max(p.name) keep (dense_rank first order by p.qty) name 
    3  , p.naid "NaID" 
    4  , n.name "Nation" 
    5  , min(p.qty) "minQty" 
    6 from product p 
    7   inner join nation n on (p.naid = n.naid) 
    8 group by p.naid 
    9  , n.name 
10/

ID NAME NaID Nation  minQty 
-- ----- ---- --------- ---------- 
01 Fruit JP Japan    50 
04 BOOK AUS Australia   8 

2 rows selected. 

Поскольку вы не используете Oracle, менее эффективный запрос, но, вероятно, работает во всех СУБД:

SQL> select p.id 
    2  , p.name 
    3  , p.naid 
    4  , n.name 
    5  , p.qty 
    6 from product p 
    7   inner join nation n on (p.naid = n.naid) 
    8 where (p.naid, p.qty) 
    9   in 
10   (select p2.naid 
11    , min(p2.qty) 
12    from product p2 
13   group by p2.naid 
14  ) 
15/

ID NAME NAID NAME    QTY 
-- ----- ---- --------- ---------- 
01 Fruit JP Japan    50 
04 BOOK AUS Australia   8 

2 rows selected. 

Обратите внимание, что если у вас есть несколько строк с одинаковым минимальным количеством на нацию, все эти строки будут возвращены, а не ju как и в предыдущем «Oracle» -query.

+0

Извините, моя БД - SQL2005. Но я попробую это с dense_rank. Спасибо большое. Я все еще не уверен в этом, но думаю, что это сработает. – Hanata

+0

Извините, я новичок SQL. Не могли бы вы помочь мне с SQL2005? – Hanata

+0

Я пробовал, но не знаю, как конвертировать в SQL2005 – Hanata

0
with cte as (
    select *, 
     row_number() over (partition by Nation order by qty) as [rn] 
    from product 
) 
select * from cte where [rn] = 1 
Смежные вопросы