Author Topic: Помогите запрос составить на SQL  (Read 5323 times)

0 Members and 1 Guest are viewing this topic.

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
Помогите запрос составить на SQL
« 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

Подскажите пожалуйста, как можно. Нужен универсальный запрос, чтобы работал в обоих случаях, когда пользователь указывает или не указывает номенклатуру

Offline blackmask

  • Newbie
  • *
  • Posts: 34
  • Karma: +0/-0
Re: Помогите запрос составить на SQL
« Reply #1 on: October 29, 2010, 09:49:37 »
Все-таки получилось составить этот запрос. Вот он:

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
« Last Edit: November 01, 2010, 15:46:05 by blackmask »