使用多个表和数据透视进行排序的sql查询

使用多个表和数据透视进行排序的sql查询,sql,sql-server-2008,Sql,Sql Server 2008,我在这里附上了我对表格和数据的查询 /****** 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]

我在这里附上了我对表格和数据的查询

     /****** 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
我有三张表格,分别是公司、职务、员工

我需要一个查询来选择最新的4名员工,按员工代码对所有公司的最新指定设计代码进行排序,按设计代码降序,然后按员工代码降序,并为每个公司选择前4名记录 结果需要像这样旋转

例:

我试过这样的方法

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名员工来自另一个名称,相同的员工代码可以与不同的公司代码重复,需要按公司代码排序,然后按员工代码排序

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

希望这就是你要找的

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 

注:据我了解

您自己试过什么吗?这是家庭作业问题吗?所以不是一个为我做事的平台…更新了我的问题,请参考所附链接,我需要类似的查询,但要按设计代码排序,然后是员工代码我需要按指定代码排序的公司的最新4名员工最新可能是一个指定的两名员工,另一个指定的两名员工,但员工代码可以重复,这就是为什么我要求按设计代码排序,然后按员工代码排序,用我尝试过的一个查询更新了我的问题我需要为我的查询中的每个员工提供前4名员工,他们需要pivoted@VickySelvam对不起,我不太明白你的逻辑。。。请尝试用其他方式解释,为什么compID=1的数字117不在118后面,为什么113105和104不在后面。如果没有104,人们可能会想:你不想要首席执行官,其余的应该是人力资源部,但我无法理解……我会清楚地解释,我有3个表,如公司、指定、员工公司包含指定和指定包含员工,因此需要查询以选择最新的4名员工,以emp1、emp2、emp3为轴,emp4和他们将来自最新的指定,如HR是最新的指定,它可能包含1名员工,CEO比HR年龄大,指定代码可能包含10名员工,因此我需要HR的所有员工和CEO@VickySelvam“以后”或“以前”是什么意思?对象名称“employee”无效。I使用临时表,替换为实际表。去除我现在已经编辑了。哈,非常感谢这是我要的,你能帮我把这个查询转换成sql吗function@VickySelvam,如果不需要预编译的参数,只需将CREATE VIEW dbo.MySupiDupiView作为SELECT。。。在前面使用它,比如从dbo.MySupiDupiView中选择*,或者像任何表源一样在联接中使用…@Shnugo你能帮我从查询中生成一个函数吗
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