Здравствуйте, 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