Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

Запрос с неверным результатом или моей логикой

$
0
0
Доброго дня.
Никак не могу решить задачку по 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.


Viewing all articles
Browse latest Browse all 7251

Trending Articles