【问题标题】:Retrieving main and secondary functions of an employee检索员工的主要和次要功能
【发布时间】:2019-08-08 11:48:39
【问题描述】:

我的表Employee、Function和Company之间的关系位于[Employee_Scope]Employee_Scope 中,我们有一个名为[SortOrder] 的订单列。 Main Function 是特定员工的SortOrder != NULL and SortOrder = MIN(SortOrder) 范围内的函数。 次要功能是其余的。

示例:

这里的 Main functionId 是“1”。
次要 functionId 为 54。
函数本身可以在[Employee_Function] 表中找到。

我已经使用以下查询提取了所有函数:

SELECT [le].[EmployeeId], [le].[FunctionId], ROW_NUMBER() OVER(PARTITION BY [le].[EmployeeId] ORDER BY [le].[SortOrder] ASC) AS [RealOrder] 
        FROM (
              SELECT [e].[EmployeeId], [es].[FunctionId], ISNULL([es].[SortOrder], 0) AS [SortOrder]
         FROM [dbo].[Employee] [e] 
                 INNER JOIN [dbo].[Employee_Scope] AS [es]  ON [es].[EmployeeId] = [e].[EmployeeId]
                  WHERE es.SortOrder != NULL
                    HAVING es.SortOrder !=MIN(es.SortOrder) ) [le]

上一个查询的输出:

现在我需要分别获取每个员工的主要功能和次要功能,所以我尝试了以下方法来获取主要功能:

SELECT [le].[EmployeeId], [le].[FunctionId], ROW_NUMBER() OVER(PARTITION BY [le].[EmployeeId] ORDER BY [le].[SortOrder] ASC) AS [RealOrder] 
                     FROM (
          SELECT [e].[EmployeeId], [es].[FunctionId], ISNULL([es].[SortOrder], 0) AS [SortOrder]
         FROM [dbo].[Employee] [e] 
         INNER JOIN [dbo].[Employee_Scope] AS [es]  ON [es].[EmployeeId] = [e].[EmployeeId]
        WHERE es.SortOrder = (SELECT MIN(es1.SortOrder) FROM Employee_Scope es1)
                 ) [le] 

预期输出:

对于员工 ID = 5205

EmployeeId FunctionId(Main) CompanyId SortOrder
5205       1                20        1

EmployeeId FunctionId(Secondary) CompanyId SortOrder
5205       1                     50        30
5205       54                    154       60

【问题讨论】:

  • 对于SortOrder,他们的“main”函数的值是否总是0
  • sortOrder 并不总是 0。它可以从任何数字开始。
  • 超过 1 个例子对我们真的有帮助,否则我们只能从我们所拥有的东西中推断出信息。像这样的细节真的应该在你的问题中。
  • 我修改了例子。
  • 所以您还需要在最终结果中将 SortOrder 1 的值替换为 0 吗?现在看起来你需要使用WHERE SortOrder = 1WHERE SortOrder > 1

标签: sql sql-server tsql


【解决方案1】:

我正在阅读这篇文章并将其视为逻辑:

对于主函数:

where sortorder = 0

对于次要的:

where sortorder > 0

我错过了什么吗?

编辑:

如果您希望最小,成为“主要”行,那么:

select t.*
from (select t.*,
             row_number() over (partition by employeeid order by sortorder) as seqnum
      from t
     ) t

然后根据需要使用where seqnum = 1where seqnum > 1

【讨论】:

  • sortOrder 并不总是 0。它可以从任何数字开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2011-06-18
  • 1970-01-01
  • 2015-04-27
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多