Tomsk Sysadmins Forum
Windows => Программирование => Topic started by: blackmask on October 28, 2010, 11:11:39
-
Есть таблица с номенклатурой, ценами и датами. Например:
Конденсатор 10.10.2002 200
Резистор 11.10.2002 210
Транзистор 12.10.2002 300
Резистор 11.10.2003 250
Транзистор 13.12.2003 350
Конденсатор 15.12.2003 240
Транзистор 14.09.2004 400
Конденсатор 30.12.2004 270
Резистор 17.05.2005 300
Мне нужно получать строки по последней и предпоследней дате. Т.е. если пользователь указывает, что ему нужны данные по Конденсатору, то получает строку
Конденсатор 15.12.2003 240 Конденсатор 30.12.2004 270
А если пользователь не указывает Номенклатуру, тогда должен получить данные по всей Номенклатуре
Конденсатор 15.12.2003 240 Конденсатор 30.12.2004 270
Резистор 11.10.2003 250 Резистор 17.05.2005 300
Транзистор 13.12.2003 350 Транзистор 14.09.2004 400
У меня параллельно этой таблице, ведется еще одна таблица со значениями всей номенклатуры по последней дате. Типа СрезПоследних в 1С. Т.е. в ней записи
Конденсатор 30.12.2004 270
Резистор 17.05.2005 300
Транзистор 14.09.2004 400
И я сделал следующий запрос:
naim-это наименование номенклатуры
date-это дата
prise-это цена
sample-это таблица с основными данными
samplePos-это таблица с данными по последним данным (СрезПоследних)
select top 1 a.naim, a.date, a.prise, e.naim, e.date, e.prise from sample as a
left outer join samplePos as e on
(a.naim = e.naim) and (a.date < e.date)
where (e.date <> '') and (a.naim = 'Конденсатор')
order by a.date desc
получается как надо
Конденсатор 15.12.2003 240 Конденсатор 30.12.2004 270
Т.е. запрос берет строку с максимальной датой, которая меньше последней
А если не указывать наименование Номенклатуры (т.е. a.naim = 'Конденсатор') тогда берет первую попавшуюся. У меня например:
Резистор 11.10.2003 250 Резистор 17.05.2005 300
а надо по всем
Конденсатор 15.12.2003 240 Конденсатор 30.12.2004 270
Резистор 11.10.2003 250 Резистор 17.05.2005 300
Транзистор 13.12.2003 350 Транзистор 14.09.2004 400
Подскажите пожалуйста, как можно. Нужен универсальный запрос, чтобы работал в обоих случаях, когда пользователь указывает или не указывает номенклатуру
-
Все-таки получилось составить этот запрос. Вот он:
select table6.naim1, table6.date1, table6.prise, table7.naim, table7.date, table7.prise from
(
select table4.naim1, table4.date1, table5.prise from
(
select max(table3.date1) as date1, table3.naim1 from
(
select table1.date as date1, table1.naim as naim1, table2.date as date2, table2.naim as naim2 from
(select al.date, al.naim from sample as al
where al.naim = 'Конденсатор') as table1
left join
(select max(pos.date) as date, pos.naim from samplePos as pos
group by pos.naim) as table2 on
(table1.naim = table2.naim) and (table1.date = table2.date)
where table2.date is null
) as table3
group by table3.naim1
) as table4
inner join
sample as table5 on
(table4.date1 = table5.date) and (table4.naim1 = table5.naim)
) as table6
left join
samplePos as table7 on
table6.naim1 = table7.naim