2010-06-24 55 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组开始的记录,所以如果其他列中的值为NULL或空格,则记录的Nr为3, ,转到上面的记录是记录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 2010-06-24 07:02:43

回答

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

Thanku..working相当不错。在一个选择,为每个领域,我需要写一个选择顶部1 ...有没有限制或性能问题嵌套选择? – satya 2010-06-24 11:13:11

+0

是的,这取决于记录的数量不会很好地执行 - 因为我们必须做4个额外的选择。但是如果你有一个[co.nr]的索引,它应该修复它。这可以通过对表格进行单次扫描来实现,但必须采用更复杂的方法。 – josephj1989 2010-06-24 15:35:45

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'不被识别为内置函数的名称。”然后,我用TOP 1取代了FIRST,然后错误是'Employee'列在选择列表中无效,因为它不在聚合函数中,也不在GROUP BY子句中。 – satya 2010-06-24 09:59:38

+0

@lucky够公平的,我编辑了我的答案,也许你可以使用第二个查询? – 2010-06-24 10:13:19

+0

Thanku..working像一个魅力。在一个选择,为每个领域,我需要编写一个选择顶部1 ...是否有嵌套选择限制或性能问题? – satya 2010-06-24 11:09:44