Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Затормозил с запросом MSSQL 2000:(


Автор: CityAC 12.9.2007, 21:47
Составьте запрос, который выводит имена и города всех покупателей, имеющих тоже количество заказов, что и покупатель " Bon app' ".
Имеется в виду  база Northwind, которая идет в комплекте MSSQL 2000
Вот до чего я дошел
Прошу не судить изучаю сикл 1 месяц.
Код

USE Northwind
DECLARE @orders int
SET @orders = ( SELECT Count(*)
    FROM Orders o1 
    WHERE CustomerId = 'BONAP')

SELECT DISTINCT CompanyName, City
FROM Customers c 
WHERE exists (
    SELECT Distinct o1.CustomerID, Count(o1.CustomerID)
    FROM Orders o1
    WHERE Count(o1.CustomerID) = @orders   --по логике хочется написать именно так, но сикл такое не допускает, может че то 
                                                                                 -- надо дописать, подскажите
    GROUP BY o1.CustomerID
    ) -- Как извлечь из этой таблицы вычисляемое значение а именно Count(o1.CustomerID

GROUP by CompanyName, City ) 




Добавлено через 11 минут и 37 секунд
Ну так всегда бывает, пока здесь объяснял суть вопроса и сам все понял. Получилось корявенько. Если кто предложит более элегантное решение - БУДУ СКАЗАТЬ БОЛЬШОЕ СПАСИБО.
Код

DECLARE @orders int
SET @orders = ( SELECT Count(*)
    FROM Orders o1 
    WHERE CustomerId = 'BONAP')+1 -- ДОБАВЛЯЛ ДЛЯ ЭКСПЕРИМЕНТОВ. Т.К.  столько заказов только у этого клиента

SELECT DISTINCT CompanyName, City
FROM Customers c 
WHERE CustomerId in (
    SELECT Distinct o1.CustomerID--, Count(o1.CustomerID)
    FROM Orders o1    
    GROUP BY o1.CustomerID
    having Count(o1.CustomerID) = @orders
    ) 
GROUP by CompanyName, City


Автор: Servena 3.10.2007, 15:45
Код

SELECT DISTINCT c.CompanyName, c.City, COUNT(o.CustomerID)
FROM Customers AS c
INNER JOIN Orders AS o  --внутреним соединением убираю тех покупателей, которые 
    ON c.CustomerID=o.CustomerID --не разместили ни одного заказа
GROUP BY c.CompanyName,c.City --группирую, чтобы использовать агрегирующую функцию COUNT
HAVING COUNT(o.CustomerID)=(SELECT Count(*) FROM Orders WHERE CustomerId = 'BONAP') --ставлю условие на количество заказов - у меня их 17


Вот мой вариант. Попробуй, так должно быть более понятно и используются разные основные конструкции.

Добавлено через 2 минуты и 50 секунд
DISTINCT в первой строчке не нужно, осталось с предыдущего запроса(хотя и так работает)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)