2013-05-07 3 views
2

Найти все бары, которые продают пиво, которые дешевле, чем все сорта пива, продаваемых «99 бутылок»Как правильно написать следующий запрос?

EDIT:

Интерпретация: Так сравнить все пиво из планкой1 и проверить, если все эти сорта пива дешевле "99 бутылок"

пример:

 Is bluemoon price in motiv cheaper than bluemoon in 99 bottles? 
    Is Guiness price in motiv cheaper than Guiness in 99 bottles? 

Поскольку существует только два сорта пива в каждом баре. Тогда у мотива есть более дешевое пиво.

Это то, что у меня есть до сих пор, но я не получаю правильный выход.

select * from sells s1, sells s2 where s1.bar <>s2.bar and s2.bar <> 
'"99 bottles"' and s1.beer=s2.beer and s1.price < all 
(select s.price from sells s where s.bar ='"99 bottles"') ; 

В таблице содержится следующее.

 bar  | beer | price 
--------------+----------+------- 
"99 bottles" | Bluemoon | 10 
"99 bottles" | Guiness |  9 
"rosies"  | Bluemoon | 11 
"rosies"  | Guiness |  5 
"motiv"  | Bluemoon |  4 
"motiv"  | Guiness |  2 

Решение должно быть мотивом, но у меня возникли проблемы с попыткой получить правильный запрос.

+0

Что такое ожидаемый выход для этого выше..table –

+0

Решение должно быть мотивом. имя панели. Как я уже говорил выше ... – caaruiz

ответ

1
SELECT DISTINCT b.bar 
FROM barbeerprice b 
WHERE b.bar <> '99 bottles' 
     -- '99 bottles' must not sell a same beer cheaper 
AND NOT EXISTS (SELECT * 
     FROM barbeerprice me 
     JOIN barbeerprice nx99 
         ON nx99.beer = b.beer 
         AND nx99.bar = '99 bottles' 
         AND nx99.bar <> me.bar 
         AND nx99.price < me.price 
     WHERE me.bar = b.bar 
     ) 
     ; 
1

Вам просто нужно пиво дешевле, чем самое дешевое пиво в 99 бутылках. Попробуйте что-то вроде:

SELECT * FROM sells s1 
where s1.price < (select MIN(price) FROM sells s2 where s2.bar = '"99 bottles"') and s1.bar <> '"99 bottles"' 

PS: если вы хотите показать только бар с пивом ALL дешевле, чем 99 бутылок, этот запрос нужно немного изменить.

+0

Я сделал редактирование, чтобы объяснить, что должен выводить запрос. Я тоже пытаюсь это сделать, но это не то, что я хочу. – caaruiz

0

Понадобится:

  • DISTINCT ключевое слово, чтобы предотвратить тот же бар от быть перечислены несколько раз, если у него есть несколько сортов пива, которые отвечают критерию
  • оговорка WHERE с подзапроса, который использует функцию MIN() для найти самую низкую цену для этого бара

Как следует:

select distinc bar 
from sellsy 
where price < (
    select min(price) 
    from sells 
    where bar = '"99 bottles"') 

Для сравнения пива пива, вопрос будет:

Найти все бары, чьи цены дешевле, чем "99 бутылок"

и запрос будет:

select s2.bar 
from sells s1 
join sells s2 
    ob s1.beer = s2.beer 
    and s2.price < s1.price 
where s1.bar = '"99 bottles"' 
group by 1 
having count(s2.beer) = count(s1.beer) 

Обратите внимание на элегантный способ, которым критерий «всех сортов пива» подтверждается с помощью контейнера HAVING. Это все еще позволяет бару продавать другие пива, что 99 бутылок не продаются.

Кроме того, только боковое примечание - оно имеет форму, чтобы иметь кавычки, сохраненные в именах.

+0

Это дает только самое дешевое пиво, которое они продают, а это не вопрос. Какое место продают самое дешевое пиво, сравнивая каждое пиво. Как указано в вопросе выше. – caaruiz

+0

Это обстоятельно отвечает на оригинальный вопрос. Я думаю, вы неправильно интерпретируете нас. Это, безусловно, домашняя работа/классная работа, поэтому лучше спросите своего учителя точно, что он имеет в виду. – Bohemian

+0

Прошу прощения, если вопросы были неправильно истолкованы, но, как я уже говорил, я хотел найти, какие бары продают более дешевое пиво, чем 99 бутылок. Я хотел сравнить пиво один за другим. Итак, что-то вроде этого 'While (список пива) {if bar1.beer == bar1.beer && bar2.name =" 99 bottles && bar1.price caaruiz

0

Следующий запрос будет найти все сорта пива, которые в равной степени или более дорогим по сравнению с пивом, продаваемых в «99 бутылок»:

select * from beers join beers compare on ( 
    beers.beer = compare.beer and beers.price >= compare.price 
) where compare.bar = '99 bottles'; 

Результат выглядит следующим образом:

bar;beer;price;bar;beer;price 
"99 bottles";"Bluemoon";10;"99 bottles";"Bluemoon";10 
"99 bottles";"Guiness";9;"99 bottles";"Guiness";9 
"rosies";"Bluemoon";11;"99 bottles";"Bluemoon";10 

этот запрос могут быть легко использованы для поиска всех баров, которые имеют более низкие цены на все пиво, нам нужно найти все стержни, которые присутствуют в вышеуказанном списке:

select distinct bar from beers where bar not in (
    select beers.bar from beers join beers compare on ( 
      beers.beer = compare.beer and beers.price >= compare.price 
     ) where compare.bar = '99 bottles' 
); 

Результат:

bar 
"motiv" 

Я надеюсь, что это то, что вы ищете.

0

Пожалуйста, попробуйте использовать «Группировать по» с «Имея предложение».

0

Проверьте нижеследующий запрос. Это должно решить вашу цель.

Declare @sells table(Bar varchar(100),brand varchar(100),price int) 
insert into @sells 
select '99 bottles','Bluemoon',10 
union all 
select '99 bottles','Guiness',9 
union all 
select '99 bottles','KF',9 
union all 
select 'rosies','Bluemoon',11 
union all 
select 'rosies','Guiness',5 
union all 
select 'motiv','Bluemoon',4 
union all 
select 'motiv','Guiness',2 

;with cteBar 
as 
(
select s1.price as actualprice,s2.* from @sells as s1 right outer join 
@sells as s2 on(s1.brand=s2.brand and s1.price>s2.price and s1.Bar='99 bottles') 
) 

select Bar from cteBar group by Bar having count(actualprice)=count(price) 

Результат - мотив, как вы ожидали.

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