2013-05-17 61 views
0

我有一個表EMPLOYEE定義如下:SQL Server查詢訂購所需的幫助

CREATE TABLE EMPLOYEE 
(
    Employee varchar(50), 
    Manager varchar(50), 
    field1 bit, 
    field2 bit 
) 
INSERT INTO EMPLOYEE VALUES ('Emp1','Mgr1',1,0) 
INSERT INTO EMPLOYEE VALUES ('Contactor1','',0,0) 
INSERT INTO EMPLOYEE VALUES ('Mgr1','',0,1) 
INSERT INTO EMPLOYEE VALUES ('Mgr2','',0,1) 
INSERT INTO EMPLOYEE VALUES ('Emp2','Mgr2',1,0) 
INSERT INTO EMPLOYEE VALUES ('Emp3','Mgr2',1,0) 
INSERT INTO EMPLOYEE VALUES ('Contractor2','',0,0) 
INSERT INTO EMPLOYEE VALUES ('Emp4','Mgr1',1,0) 

假設:

  1. 如果字段1等於1,那麼,實體是員工。

  2. 如果field2等於1,那麼該實體就是manager。

  3. 如果field1和field2等於0,那麼實體就是承包商。

  4. 對於field1和field2,特定行的值不能爲1。

查詢以下值SELECT * FROM EMPLOYEE回報:

enter image description here

我需要一個查詢,這樣我可以按以下格式得到的結果:

Desired Output

基本上,

結果應該是第一個經理跟着相應的員工然後下一個經理跟着由相應的員工編輯,最後應該有所有的承包商。

+1

如果您引入了區分僱員類型的列,而不必依賴名稱 - 例如管理人員和承包商從您的數據中除名稱之外難以區分。 –

+0

另外,你是否需要這個擴展到更多的層次。例如。是否存在具有值的行('Emp99,Emp1'),是否應該出現在預期結果的第2行和第3行之間? –

+0

@Damien_The_Unbeliever:添加了字段。對於第二個問題,(Emp99,Emp1)是不可能的。 – Abhineet

回答

1

正是基於您的樣本數據和預期的結果,這個工程:

select * from Employee order by 
CASE WHEN Employee like 'C%' THEN 1 ELSE 0 END, --Force Contractors to the end 
COALESCE(NULLIF(Manager,''),Employee), --Get employees and their managers together 
CASE WHEN Employee like 'M%' THEN 0 ELSE 1 END, --Sort Managers before employees 
Employee --Sort by employee name 

但要注意我的問題我的意見,如果你有更復雜的數據

隨着field1field2在修正問題定義:

select * from Employee order by 
CASE WHEN field1=0 and field2=0 THEN 1 ELSE 0 END, --Force Contractors to the end 
COALESCE(NULLIF(Manager,''),Employee), --Get employees and their managers together 
field2 desc, --Sort Managers before employees 
Employee --Sort by employee name 
+0

@Damien_The_Unbeliver Order BY子句中的1或0是指列ID或升序和降序?另外,你可以使用field1和field2回答問題。 – Abhineet

+1

@Abhineet - 1和0只是具有所需屬性的數字值 –

+0

在我的數據庫中,我沒有Manager和Employee列名。因此,如果我將查詢修改爲 SELECT * FROM EMPLOYEE ORDER BY CASE當field1 = 0且field2 = 0 THEN 1 ELSE 0 END, COALESCE(field2,field1), field2 desc, field1 我沒有得到所需的輸出:( – Abhineet

1

的基本順序是

... ORDER BY Manager + Employee 

如果經理允許NULL,這是更好的IMO

... ORDER BY ISNULL(Manager, Employee) 

有關SQL Server 2012中,無論是空或不

... ORDER BY CONCAT(Manager,Employee) 

然而,沒有鑑別,以顯示員工VS承包商VS經理差異

因此使用實際字符串值...

ORDER BY 
    CASE WHEN Employee LIKE 'Contractor%' THEN 1 ELSE 0 END, 
    CONCAT(Manager,Employee)