2010-06-24 3 views
0

У меня есть таблица с записями как, например, данные ниже CO.Nr: TH-123, Th-456 и т. Д. Мне нужно собрать данные.Запрос для сбора данных из предыдущих строк

Nr.  CO.Nr   Employee  Resp   Description  Date 

1   TH-123   ABC   NULL    HELLO   10.05.2010 
2   TH-123   NULL   S14    NULL   18.05.2010 
3   TH-123   DEF        NULL   13.05.2010 
4   TH-456   XYZ   NULL    NULL    1.07.2010 
5   TH-456   NULL   S19    SOME    NULL 
6   TH-456           TEXT   08.05.2010 
7   TH-456      NULL        28.05.2010 

Для TH-123, Если Nr. максимальная, то есть запись, которую мне нужно начинать с группы с помощью CO.Nr, так что это запись с Nr как 3, , если значение в других столбцах равно NULL или пробелу, перейдите к записи выше, которая является записью с Nr как 2, даже если он имеет нулевое значение, перейдите к записи выше этой записи с номером Nr. как 1 в этом случае. В 3 записях мне нужно взять максимум даты. Для приведенных выше данных, мне нужно иметь выход как,

 CO.Nr   Employee  Resp   Description  Date 

     TH-123   DEF   S14    HELLO   18.05.2010 
     TH-456   XYZ   S19    TEXT    01.07.2010 

Спасибо заранее!

+0

Я думаю, вы будете нуждаться в хранимую процедуру или какой-либо логики в вашем коде. Простой запрос, возможно, не сможет делать то, что вы хотите. – chiccodoro

ответ

0

вы можете сделать это много способов

select [co.nr], 
(select top(1) employee from mytable b where b.[co.nr]=a.[co.nr] and 
         employee is not null order by nr desc) as employee, 
(select top(1) resp from mytable b where b.[co.nr]=a.[co.nr] and 
         resp is not null order by nr desc) as resp, 
(select top(1) description from mytable b where b.[co.nr]=a.[co.nr] and 
         description is not null order by nr desc) as description, 
(select max([date]) from mytable b where b.[co.nr]=a.[co.nr]) as Date 
from (
select distinct [co.nr] 
from mytable) as a 
+0

Спасибо. Хорошо работает. В одном выберите, для каждого поля мне нужно написать select top 1 ... Есть ли какие-либо ограничение или производительность при вложенных выборках? – satya

+0

Да, это не будет очень хорошо работать в зависимости от количества записей - потому что мы должны сделать 4 дополнительных выбора на основе. Но если у вас есть индекс на [co.nr], nr, он должен его исправить. Это может быть достигнуто путем одного сканирования через таблицу, но для этого необходимо использовать более сложный подход. – josephj1989

0

Вы можете использовать подзаголовок, чтобы выбрать нужную запись, а затем присоединиться к ней. Что-то вроде следующего для сотрудников одного (я оставлю остальные столбцы в качестве упражнения):

SELECT MyTable.[CO.Nr], Employees.Employee 
FROM MyTable 
LEFT OUTER JOIN (SELECT FIRST(Employee) as Employee, [CO.Nr] 
       FROM MyTable 
       WHERE Employee IS NOT NULL AND Employee <> '' 
       GROUP BY [CO.Nr] 
       ORDER BY [Nr.] DESC) Employees 
      ON MyTable.[CO.Nr] = Employees.[CO.Nr] 
GROUP BY MyTable.[CO.Nr] 

Или, если FIRST() не является допустимым агрегатной функции, как уже упоминалось в комментариях, вы можете попробовать подзапросы в вашей статье SELECT, как:

SELECT t.MyTable.[CO.Nr], 
     (SELECT TOP(1) x.Employee 
     FROM MyTable x 
     WHERE x.[CO.Nr] = t.[CO.Nr] 
     AND x.Employee IS NOT NULL AND x.Employee <> '' 
     ORDER BY [Nr.] DESC) as Employee 
FROM MyTable t 
GROUP BY t.[CO.Nr] 
+0

Спасибо за ответ, когда я выполняю этот запрос, ошибка, с которой встречается, - «FIRST» не распознается как имя встроенной функции ». Затем я заменил FIRST на TOP 1, тогда ошибка в столбце «Сотрудник» неверна в списке выбора, потому что она не находится в агрегированной функции, а не в предложении GROUP BY. – satya

+0

@lucky Достаточно честный, я отредактировал свой ответ и, возможно, вы можете использовать второй запрос? –

+0

Thanku..working как charm.In one select, для каждого поля мне нужно написать select top 1 ... Есть ли какие-либо проблемы с ограничением или производительностью с вложенными выделениями? – satya

Смежные вопросы