2014-04-14 50 views
1

我知道沒有與訪問相同的等效函數,所以實際上我只是尋求幫助來編寫查詢來執行相同的任務。基本上,這裏是我到目前爲止有:第一個SQL的等效函數

SELECT PR.SSN as SSN, 
    MIN(PR.[Last Name]) as [Last Name], 
    MIN(PR.Address) as [Address], 
    MIN(PR.City) as [City], 
    MIN(PR.State) as [State], 
    MIN(PR.Zip) as [Zip], 
    MIN(cast(PR.[Pay Begin Period] as date)) as [Pay Begin Period], 
    MAX(cast(PR.[Pay End Period] as date)) as [Pay End Period], 
FROM Payroll.dbo.[Table1] PR 
WHERE (cast(PR.[Pay Begin Period] as date) > '1/1/2013' AND 
     cast(PR.[Pay End Period] as date) < '12/31/2013') 
GROUP BY PR.SSN 

這個查詢將檢索最早[支付期間開始]和最新的[付款期末]每個SSN。但是,我希望[姓氏]從最早的[薪酬開始階段]中恢復。在某些情況下,人們會有[姓氏]更改。我們只想要記錄最早/最早的一個。

所以我想改變這一行:

MIN(PR.[Last Name]) as [Last Name], 

是這樣的:

(SELECT [Last Name] 
FROM Payroll.dbo.[Table1] 
WHERE [Pay Begin Period] = Min([Pay Begin Period])), 

我認識到,不工作,但是這是我可以解釋什麼是最好的方式,我正在尋找。

+0

這是爲[標籤:SQL服務器]? [tag:sql]標籤適用於該語言,如果您需要特定產品的幫助,該標籤會告訴您應該添加產品特定標籤。 –

+0

不幸的是,MS Access允許將第一項添加到表中,但是表中沒有固有的數據順序,您必須使用順序來確定正確的順序。如果您使用一些示例數據編輯問題,然後得到期望的結果,則可能更容易確定解決問題的最佳解決方案。 – Taryn

+0

對不起,我更新了標籤到sql-server –

回答

4

在SQL Server中,可以通過枚舉行每個SSN,然後選擇第一個做到這一點:

SELECT PR.SSN as SSN, 
    MAX(CASE WHEN seqnum = 1 THEN PR.[Last Name] END) as [Last Name], 
    MIN(PR.Address) as [Address], 
    MIN(PR.City) as [City], 
    MIN(PR.State) as [State], 
    MIN(PR.Zip) as [Zip], 
    MIN(cast(PR.[Pay Begin Period] as date)) as [Pay Begin Period], 
    MAX(cast(PR.[Pay End Period] as date)) as [Pay End Period], 
FROM (SELECT pr.*, 
      ROW_NUMBER() OVER (PARTITION BY PR.SSN ORDER BY [Pay Begin Period]) as seqnum 
     FROM Payroll.dbo.[Table1] PR 
    ) pr 
WHERE (cast(PR.[Pay Begin Period] as date) > '1/1/2013' AND 
     cast(PR.[Pay End Period] as date) < '12/31/2013') 
GROUP BY PR.SSN; 

row_number()是排名函數,一個組內的序列號分配給行。該組由partition by子句定義,因此每個值都會得到其自己的數字序列。訂購由ORDER BY條款指定。

+0

這位'MAX(CASE WHEN seqnum = 1 THEN PR。[Last Name] END)'是非常好的。 –

+0

我收回我的陳述,我犯了一個錯誤。 –

+0

是的它的工作,非常感謝你! –