Re: Задача по SQL
От: greenpci  
Дата: 14.04.06 01:11
Оценка:
Здравствуйте, msqrt84, Вы писали:

M>Привет, всем!


M>Есть одна задачка. Ознакомился с ней 7 месяцев назад (на собеседовании). Решить не смог. Забыл. Сейчас вновь решил ей заняться. Ну, ни как не получается.


M>ДАНО:


M>таблица 1 с исходными данными. Есть поля, где храниться продукт (product), дата прихода продукта на склад (date), количество продукта (quantity).


M>Таблица 1. Исходные данные.


M>
M>---------------------------------------------
M>product        date        quantity
M>---------------------------------------------
M>sugar        01.02.2005    15
M>sugar        25.04.2005    7.5
M>sugar        14.01.2005    11.5
M>salt         10.06.2004    20
M>flour        07.11.2003    17
M>---------------------------------------------
M>



M>ПОЛУЧИТЬ:


M>написать SQL-запрос в соответствии со стандартом ANSI SQL'92, используя один оператор SELECT без вложенных подзапросов, и получить таблицу 2 с результатом выборки, где на пересечении строк и столбцов находится сумма количеств определённого продукта за конкретный год.


M>Таблица 1. Результат выборки.


M>
M>----------------------------------------
M>product        2003    2004    2005
M>----------------------------------------
M>sugar                           34
M>salt                    20
M>flour           17
M>----------------------------------------
M>



M>Всем, спасибо.


Кажется нашел решение. Зацените:

begin tran
set dateformat dmy
declare @supply table (product varchar(10), date smalldatetime, quantity numeric(10,2))
insert into @supply values ('sugar', '01.02.2005',15)
insert into @supply values ('sugar', '25.04.2005',7.5)
insert into @supply values ('sugar', '14.01.2005',11.5)
insert into @supply values ('salt', '10.06.2004',20)
insert into @supply values ('flour', '07.11.2003',17)

select * from @supply

select s.product as product,
case
when count(s3.product) > 1 then sum(s3.quantity)/sqrt(count(s3.product))
else sum(s3.quantity)
end as y2003,
case
when count(s4.product) > 1 then sum(s4.quantity)/sqrt(count(s4.product))
else sum(s4.quantity)
end as y2004,
case
when count(s5.product) > 1 then sum(s5.quantity)/sqrt(count(s5.product))
else sum(s5.quantity)
end as y2005
from @supply s
left join @supply s3
on s3.product = s.product and s3.date between '01.01.03' and '31.12.03'
left join @supply s4
on s4.product = s.product and s4.date between '01.01.04' and '31.12.04'
left join @supply s5
on s5.product = s.product and s5.date between '01.01.05' and '31.12.05'
group by s.product


rollback tran
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.