2014-09-10 16 views
0

我得到了一個情況來顯示第一個前6個記錄。前FirstCol前3條記錄和SecondCol後3位。我的查詢是這樣的:如何獲得第一個頂部6個記錄無差異列T-sql?

select top 6 [EmpName] 
from [Emp ] 
order by [Salary] Desc 

結果:

[EmpName] 
---------------------- 
Sam   
Pam   
Oliver   
Jam 
Kim 
Nixon 

但我想要的結果看起來像這樣:

FirstCol  SecondCol 
Sam   Jam 
Pam   Kim 
Oliver  Nixon 
+3

爲什麼不只是在UI上格式化這樣的結果?爲什麼他們需要像這樣從數據庫中返回? – Kritner 2014-09-10 19:04:51

+0

通過SQL Server以這種方式格式化它可能會使服務器工作速度變慢。正如@Kritner所說的那樣,通常情況下將它放到UI中,然後按照您想要的樣式進行格式化。更好,更快,更容易。 – Hoh 2014-09-10 19:06:44

+0

嗨Kritner,這是我們的要求。謝謝 – user3583912 2014-09-10 19:18:22

回答

1

您可以使用多個窗口函數做到這一點,這是一種醜陋的,但它會得到你想要的結果:

;with data as 
(
    -- get your Top 6 
    select top 6 empname, salary 
    from emp 
    order by salary desc 
), 
buckets as 
(
    -- use NTILE to split the six rows into 2 buckets 
    select empname, 
    nt = ntile(2) over(order by salary desc), 
    salary 
    from data 
) 
select 
    FirstCol = max(case when nt = 1 then empname end), 
    SecondCol = max(case when nt = 2 then empname end) 
from 
(
    -- create a row number for each item in the buckets to return multiple rows 
    select empname, 
    nt, 
    rn = row_number() over(partition by nt order by salary desc) 
    from buckets 
) d 
group by rn; 

請參閱SQL Fiddle with Demo。這使用函數NTILE,這將採用六行數據集並將其分成兩個桶 - 桶1中的3行和桶2中的3行。NTILE中的(2)用於確定桶的數量。

接下來,我使用row_number()爲每個存儲桶中的每行創建唯一值,這允許您爲每列返回多行。

+0

感謝您的回覆,這是我想要的 – user3583912 2014-09-10 19:48:28

2
; WITH TOP_3 AS 
(
    select TOP 3 [EmpName] 
     ,ROW_NUMBER() OVER (ORDER BY [Salary] Desc) rn 
    from [Emp ] 
    order by [Salary] Desc 
), 
    Other3 AS 
(
    SELECT [EmpName] 
      ,ROW_NUMBER() OVER (ORDER BY [Salary] Desc) rn 
    FROM Employees 
    ORDER BY [Salary] DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY 
) 
SELECT T3.[EmpName] , O3.[EmpName] 
FROM TOP_3 T3 INNER JOIN Other3 O3 
ON T3.RN = O3.RN 
ORDER BY T3.RN ASC 
+0

這是一個解答你的答案,但絕對不是最好的。閱讀我和@Kritner的評論,並以這種方式更好地完成。無論如何,請投票回答。 – Hoh 2014-09-10 19:07:49

+0

嗨M.Ali,感謝您的回覆,但我的serer不是2012版。它的2008年,你可以建議任何其他備用。謝謝 – user3583912 2014-09-10 19:16:51

+0

爲什麼你在你的問題中標記了SQL Server 2012呢? – 2014-09-10 19:21:02

相關問題