2017-04-13 114 views
0

sql pivot with dynamic columns我重視我在這裏表和數據查詢,SQL查詢排序與多個表和數據透視

 /****** Object: Table [dbo].[Company] Script Date: 13/04/2017 3:37:15 PM ******/ 
CREATE TABLE [dbo].[Company](
    [Comp ID] [int] NULL, 
    [Company Name] [nvarchar](50) NULL 
) ON [PRIMARY] 

GO 
/****** Object: Table [dbo].[Designation] Script Date: 13/04/2017 3:37:15 PM ******/ 
CREATE TABLE [dbo].[Designation](
    [Design ID] [int] NULL, 
    [Comp ID] [int] NULL, 
    [Designation] [nvarchar](50) NULL, 
    [Design Code] [int] NULL 
) ON [PRIMARY] 

GO 
/****** Object: Table [dbo].[Employee] Script Date: 13/04/2017 3:37:15 PM ******/ 
CREATE TABLE [dbo].[Employee](
    [Emp ID] [int] NULL, 
    [Comp ID] [int] NULL, 
    [Design ID] [int] NULL, 
    [Employee Name] [nvarchar](50) NULL, 
    [Employee Code] [int] NULL 
) ON [PRIMARY] 

GO 
INSERT [dbo].[Company] ([Comp ID], [Company Name]) VALUES (1, N'Company 1') 
GO 
INSERT [dbo].[Company] ([Comp ID], [Company Name]) VALUES (2, N'Company 2') 
GO 
INSERT [dbo].[Designation] ([Design ID], [Comp ID], [Designation], [Design Code]) VALUES (1, 1, N'CEO', 2) 
GO 
INSERT [dbo].[Designation] ([Design ID], [Comp ID], [Designation], [Design Code]) VALUES (2, 1, N'HR', 1) 
GO 
INSERT [dbo].[Designation] ([Design ID], [Comp ID], [Designation], [Design Code]) VALUES (3, 2, N'CEO', 1) 
GO 
INSERT [dbo].[Designation] ([Design ID], [Comp ID], [Designation], [Design Code]) VALUES (3, 2, N'Developer', 2) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (1, 1, 1, N'Test emp1', 101) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (2, 1, 1, N'Test emp2', 102) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (3, 1, 2, N'Test emp3', 103) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (4, 1, 2, N'Test emp4', 104) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (5, 1, 1, N'Test emp5', 105) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (6, 1, 2, N'Test emp6', 106) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (7, 2, 1, N'Test emp7', 107) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (8, 2, 1, N'Test emp8', 108) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (9, 2, 2, N'Test emp9', 109) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (10, 2, 2, N'Test emp10', 110) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (11, 2, 1, N'Test emp11', 111) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (12, 2, 1, N'Test emp12', 112) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (13, 1, 1, N'Test emp13', 113) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (14, 1, 2, N'Test emp14', 114) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (15, 2, 1, N'Test emp15', 115) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (16, 2, 2, N'Test emp16', 116) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (17, 1, 1, N'Test emp17', 117) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (18, 1, 2, N'Test emp18', 118) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (19, 2, 1, N'Test emp19', 119) 
GO 
INSERT [dbo].[Employee] ([Emp ID], [Comp ID], [Design ID], [Employee Name], [Employee Code]) VALUES (20, 2, 2, N'Test emp20', 120) 
GO 

我有3代表爲公司名稱,員工

我需要查詢根據設計代碼的降序選擇最新的4名員工(根據員工代碼排序)以獲得所有公司的最新指定(設計代碼)訂單,然後按照員工代碼的降序選擇每個公司的前4條記錄 ,結果需要透視像

例如:

CompanyID Emp1  Emp2  Emp3  Emp4 
---------- 
1   118  114  106  103 

我已經試過類似,

select  
    emp.[Comp ID], 
    emp.[Design ID], 
    emp.[Emp ID], 
    emp.[Employee Code], 
    design.[Design Code], 
    emp.[Employee Code], 
    comp.[Company Name], 
    design.Designation, 
    emp.[Employee Name] 
    from Employee emp  
    join Designation design on design.[Design ID]=emp.[Design ID] 
    join Company comp on comp.[Comp ID]=emp.[Comp ID] 
    order by comp.[Comp ID] desc, design.[Design Code] desc, emp.[Employee Code] desc 

我首先需要4名員工擺動的EMP1,EMP2,EMP3和emp4對每一個公司來說可能是2可能下降從其他同和員工代碼可以與不同的公司代碼重複一個指定和3,它需要由公司代碼,然後由員工代碼排序

+1

你有你自己嘗試新鮮事物?這是一個*作業問題*嗎? SO是不是*我的工作對我來說*平臺... – Shnugo

+0

更新了我的問題,請參考我附帶的鏈接我需要類似的查詢,但要按設計代碼排序,然後員工代碼 –

回答

1

希望這是你在找什麼,

SELECT [comp id], 
     emp1, 
     emp2, 
     emp3, 
     emp4 
FROM (SELECT [comp id], 
       [employee code], 
       'Emp' + Cast(rn AS CHAR(10)) AS Empname 
     FROM (SELECT A.[comp id], 
         A.[employee code], 
         Row_number() 
         OVER ( 
          partition BY A.[comp id] 
          ORDER BY B.[comp id], C.[design code] 
         DESC, A.[employee code] DESC) 
           AS rn 
       FROM dbo.employee A 
         INNER JOIN dbo.company B 
           ON A.[comp id] = B.[comp id] 
         INNER JOIN dbo.designation C 
           ON C.[design code] = A.[design id] 
            AND C.[comp id] = B.[comp id])A 
     WHERE rn <= 4)B 
     PIVOT (Max([employee code]) 
      FOR empname IN (emp1, 
          emp2, 
          emp3, 
          emp4)) pv 

結果看起來像下面,

comp id emp1 emp2 emp3 emp4 
1   118 114 106 104 
2   120 116 110 109 

注:按我的理解

+0

無效的對象名稱'#employee'。 –

+0

我用臨時表,用你的實際表替換。 (去掉 #)。 我現在編輯過。 – PP006

+0

ha非常感謝你這是我的要求,你能幫我轉換這個查詢作爲一個SQL函數 –

0

試試這樣說:

SELECT p.* 
FROM 
(
    SELECT 
     comp.[Company Name], 
     design.[Designation], 
     emp.[comp id], 
     emp.[Employee Code], 
     'Emp' + CAST(ROW_NUMBER() OVER (PARTITION BY emp.[Comp ID], emp.[Design ID] ORDER BY emp.[Comp ID] desc, emp.[Design ID] desc, emp.[Emp ID] desc) AS VARCHAR(100)) AS ColumnName 
    from employee as emp 
     join designation as design on design.[Design ID]=emp.[Design ID] 
     join company as comp on comp.[Comp ID]=emp.[Comp ID] 
) AS tbl 
PIVOT 
(
    MAX([Employee Code]) FOR ColumnName IN(Emp1,Emp2,Emp3,Emp4) 
) AS p 
+0

我需要最新的4名員工爲指定代碼(最新)可能是來自一個指定的兩名僱員,而其他僱員代碼可能是兩個,但員工代碼可以重複這一點爲什麼我要求按設計代碼然後通過員工代碼進行排序, 已更新我的問題與查詢我已嘗試我需要頂部我的查詢中每個員工有4名員工,他們需要進行調整 –

+0

@VickySelvam對不起,我不太瞭解你的邏輯......請嘗試解釋換句話說,爲什麼compID = 1 117沒有遵循118爲什麼113,105和104被省略。沒有104可以這樣想:*你不想要CEO,其他人應該是HR *,但我不能遵循...... – Shnugo

+0

將會解釋清楚, 我有3張表作爲公司,指定,僱員 公司包含指定和指定包含員工 因此需要一個查詢來選擇以emp1,emp2,emp3,emp4爲樞軸的最新4名員工,他們將來自最新的指定,例如HR是最新的指定,它可能包含1名員工和CEO比HR更早(按指定代碼)可能包含10名員工,因此我需要所有來自人力資源部的員工以及來自首席執行官的最新3名員工(按僱員代碼) –