Доброго дня.
Никак не могу решить задачку по SQL.
Люди Добрые, пните в какую сторону смотреть. Где я неправ?
Скоро уже умом тронусь :(
Первый вариант.
Второй вариант
Никак не могу решить задачку по SQL.
Люди Добрые, пните в какую сторону смотреть. Где я неправ?
Скоро уже умом тронусь :(
Задача |
---|
Для каждого производителя подсчитать: сколько имеется в наличии его продуктов (любого типа) с неуникальной для этого производителя ценой и количество таких неуникальных цен. Вывод: производитель, количество продуктов, количество цен. |
Первый вариант.
with AllProducts as --Все продукты с ценами--------------------------------------------------- ( select p.*, t.code, t.price from dbo.Product p inner join dbo.PC t on p.model = t.model union all select p.*, t.code, t.price from dbo.Product p inner join dbo.Printer t on p.model = t.model union all select p.*, t.code, t.price from dbo.Product p inner join dbo.Laptop t on p.model = t.model ) , CountNonUniqProducts as --Количество продуктов с не уникальной ценой------------------------- ( select case -- Когда присутствует вторая цена => Продукт с такой ценой не уникальный - считаем все что есть when row_number()over(partition by al_out.maker, al_out.price order by al_out.maker, al_out.price) = 2 then (select count(al_in.price) from AllProducts al_in where al_in.maker=al_out.maker and al_in.price=al_out.price) end 'CountNonUniq' , al_out.* from AllProducts al_out ) select cnt.maker ,isnull(sum(cnt.CountNonUniq),0) 'CountModels' ,count(cnt.CountNonUniq)'CountPrice' from CountNonUniqProducts cnt group by cnt.maker ; --Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе. --* Неверное число записей (меньше на 6)
Второй вариант
With CountNonUniqProducts as --Количество продуктов с не уникальной ценой ( select al.maker, al.price, count(*) 'NonUniq' from ( select p.*, t.code, t.price from dbo.Product p inner join dbo.PC t on p.model = t.model union all select p.*, t.code, t.price from dbo.Product p inner join dbo.Printer t on p.model = t.model union all select p.*, t.code, t.price from dbo.Product p inner join dbo.Laptop t on p.model = t.model ) al group by al.maker, al.price having count(*)>1 ) select distinct p.maker ,( select isnull(sum(cnt.NonUniq),0) from CountNonUniqProducts cnt where cnt.maker=p.maker ) 'CountModels' ,( select count(cnt.NonUniq) from CountNonUniqProducts cnt where cnt.maker=p.maker ) 'CountPrice' from dbo.Product p --Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе. --* Несовпадение данных (4)
Структура БД |
---|
![]() Схема БД состоит из четырех таблиц: Product(maker, model, type) PC(code, model, speed, ram, hd, cd, price) Laptop(code, model, speed, ram, hd, price, screen) Printer(code, model, color, type, price) Таблица Product представляет производителя (maker), номер модели (model) и тип ('PC' - ПК, 'Laptop' - ПК-блокнот или 'Printer' - принтер). Предполагается, что номера моделей в таблице Product уникальны для всех производителей и типов продуктов. В таблице PC для каждого ПК, однозначно определяемого уникальным кодом – code, указаны модель – model (внешний ключ к таблице Product), скорость - speed (процессора в мегагерцах), объем памяти - ram (в мегабайтах), размер диска - hd (в гигабайтах), скорость считывающего устройства - cd (например, '4x') и цена - price. Таблица Laptop аналогична таблице РС за исключением того, что вместо скорости CD содержит размер экрана -screen (в дюймах). В таблице Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный – 'Laser', струйный – 'Jet' или матричный – 'Matrix') и цена - price. |