【问题标题】:sql query for sort by with multiple tables and PIVOT使用多个表和 PIVOT 进行排序的 sql 查询
【发布时间】:2017-04-13 10:12:37
【问题描述】:

sql pivot with dynamic columns 我已在此处附加了我对表和数据的查询,

     /****** 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 个表,分别是 Company、Designation、Employee

我需要一个查询来选择最新的 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按公司代码排序,然后按员工代码排序

【问题讨论】:

  • 您自己尝试过什么吗?这是一个家庭作业问题吗? SO 不是一个为我做我的工作平台...
  • 更新了我的问题,请参考所附链接我需要类似的查询,但要按设计代码然后员工代码排序

标签: sql sql-server-2008


【解决方案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

注意:根据我的理解

【讨论】:

  • 无效的对象名称“#employee”。
  • 我用的是临时表,用你的实际表代替。 (消除 #)。我现在已经编辑了。
  • 谢谢你,这是我被要求的,你能帮我把这个查询转换为sql函数吗
  • @VickySelvam,如果您不需要预编译参数,只需将CREATE VIEW dbo.MySupiDupiView AS SELECT... 放在前面并像SELECT * FROM dbo.MySupiDupiView 一样使用它,或者像任何表源一样在连接中使用它...
  • @Shnugo 你能帮我从查询中做一个函数吗
【解决方案2】:

试试这样:

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

【讨论】:

  • 我需要按指定代码排序的公司的最新 4 名员工(最新)可能是一个指定的两名员工和另一个指定的 2 名员工,但员工代码可以重复,这就是我要求按设计代码排序的原因通过员工代码,用我尝试过的查询更新了我的问题
  • @VickySelvam 对不起,我不太明白你的逻辑......请试着解释一下,为什么 compID=1 数字 117 没有跟在 118 后面,为什么省略了 113,105 和 104。如果没有 104,人们可能会想:你不需要 CEO,剩下的应该是 HR,但我不能跟...
  • 将清楚地解释,我有 3 个表作为公司,名称,员工公司包含名称和名称包含员工,因此需要查询以选择最新的 4 名员工,以 emp1、emp2、emp3、emp4 为轴心,它们是要来自最新的名称,例如 HR 是最新的名称,它可能包含 1 名员工,CEO 比 HR 年长(按名称代码)可能包含 10 名员工,所以我需要 HR 的所有员工和 CEO 的最新 3 名员工(按员工代码)
  • @VickySelvam laterolder 是什么意思?
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多