2013-04-23 7 views
0

У меня проблема sql. У меня есть две таблицы:SQL Division после HAVING-clausel

album (asin(pk), title, artist, price, release, label, rank) 
track (album(pk), dsk, posn, song) 

Мне нужно найти дешевые альбомы, где цена за песню составляет менее 0,5 доллара. Как я могу фильтровать с помощью divion? Моя попытка:

SELECT a.title,a.price,COUNT(b.song) 
FROM album a 
JOIN track b 
ON (asin=album) 
GROUP BY album 
HAVING COUNT(a.price/b.song) 

Я знаю, что это неправильно. Я очень новичок в SQL, и это сбивает с толку. Я надеюсь, что вы можете мне помочь.

спасибо!

ответ

1
SELECT a.title, a.price, COUNT(b.song) 
    FROM album a 
    JOIN track b ON asin=album 
GROUP BY a.title, a.price 
    HAVING 1.0 * a.price/COUNT(b.song) < 0.5 

условие соединения asin=album выглядит подозрительным. Исправьте его, добавив псевдонимы таблиц для столбцов.

+0

Спасибо, что работает! :) Я поставил псевдонимы для столбцов. –

1

Вам нужно сгруппировать по a.asin (я полагаю, это уникальный идентификатор альбома, название потенциально может быть идентичным), потому что вы хотите сгруппировать все треки в одну строку, представляющую альбом. COUNT(*) будет подсчитывать количество строк, сгруппированных в эту запись (то же самое, что и количество песен в альбоме). HAVING вычисляет среднюю цену песни и говорит оставить только альбомы дешевле, чем 0,5:

SELECT a.title, a.price, COUNT(*) 
FROM album a 
JOIN track b ON b.asin=b.album 
GROUP BY a.asin 
HAVING a.price/COUNT(*) < 0.5 
+0

'Наличие .. n' не работает во всех СУБД. Например, выражение 'n' в предложении SELECT не может быть указано в предложении HAVING в sql-сервере. – RichardTheKiwi

+0

Справедливая точка, под редакцией – sashkello