2010-06-24 54 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