【问题标题】:SQL Condition based dataset基于 SQL 条件的数据集
【发布时间】:2011-05-19 17:42:58
【问题描述】:

我有一个不是我设计的 SQL Server 数据库。 员工的学位、执照和证书存储在几个不同的表中。 我已经编写了查询以将所有这些信息连接在一起,这样我就可以看到数据的整体结果。我被要求为此数据创建一个视图,该视图仅返回他们获得的最高学位和两个最高认证。 问题是,由于它是预先存在的数据,因此数据中没有内置层次结构。所有学位和证书都简单地存储为与其员工编号关联的字符串。 第一个合乎逻辑的步骤是创建一个邻接列表(我相信这是正确的术语)。 例如,“MD”是您可以在我们的列表中获得的最高学位。所以我给出了 1 的“排名”。下一个较低的学位被“排名”为 2。依此类推。 我可以加入包含这些的文本字段并返回它们的相关排名。 我遇到的问题是根据这个排名只返回两个最高的。 如果员工拥有多个学位或证书,则将其列在第二行或第三行。从逻辑的角度来看,我需要对员工 ID、名字和姓氏进行分组。然后一些如何根据我为他们创建的“排名”连接学位、证书和执照。就我的想法而言,这不是一个真正的层次结构,因为我只需要知道最高的两个,而不必知道结果之间的关系。

另一个潜在的警告是数据库必须保持在 SQL Server 2000 兼容模式。

任何可以提供的帮助将不胜感激。谢谢。

select a.EduRank as 'Licensure Rank',
   b.EduRank as 'Degree Rank',
   EmpComp.EecEmpNo, 
  EmpPers.EepNameFirst, 
   EmpPers.EepNameLast, 
   RTRIM(EmpEduc.EfeLevel),
   RTRIM(EmpLicns.ElcLicenseID),
   a.EduType,
   b.EduType
       from empcomp 
      join EmpPers on empcomp.eeceeid = EmpPers.eepEEID
      join EmpEduc on empcomp.Eeceeid = EmpEduc.EfeEEID
      join EmpLicns on empcomp.eeceeid = EmpLicns.ElcEEID
      join yvDegreeRanks a on a.EduCode = EmpLicns.ElcLicenseID
      join yvDegreeRanks b on b.EduCode = EmpEduc.EfeLevel

【问题讨论】:

  • 我曾尝试使用 TOP 2,但我需要为每个员工返回 TOP 2,而不是为整个数据集返回。

标签: sql


【解决方案1】:

我想我可以看出您的问题是什么 - 但我不确定。将表格连接在一起为您提供了“双行”。解决此查询的“快速而肮脏”的方法是使用联接以外的子查询。这样做,您只能选择TOP 1 学位和TOP 2 认证。

编辑:你能试试这个查询吗?

SELECT *
FROM employSELECT tblLicensures.EduRank as 'Licensure Rank',
    tblDegrees.EduRank as 'Degree Rank',
    EmpComp.EecEmpNo, 
    EmpPers.EepNameFirst, 
    EmpPers.EepNameLast, 
    RTRIM(tblDegrees.EfeLevel),
    RTRIM(tblLicensures.ElcLicenseID),
    tblLicensures.EduType,
    tblDegrees.EduType
FROM EmpComp
    LEFT OUTER JOIN EmpPers ON empcom.eeceeid = EmpPers.eepEEID
    LEFT OUTER JOIN
        -- Select TOP 2 Licensure Ranks
        (
            SELECT TOP 2 a.EduType, a.EduRank, EmpLicns.ElcEEID
            FROM yvDegreeRanks a 
                INNER JOIN EmpLicns on a.EduCode = EmpLicns.ElcLicenseID
            WHERE EmpLincs.ElcEEID = empcomp.eeceeid
            ORDER BY a.EduRank ASC
        ) AS tblLicensures ON tblLicensures.ElcEEID = empcomp.Eeceeid
    LEFT OUTER JOIN 
        -- SELECT TOP 1 Degree
        (
            SELECT TOP 1 b.EduType, b.EduRank, EmpEduc.EfeEEID, EmpEduc.EfeLevel
            FROM yvDegreeRanks b 
                INNER JOIN EmpEduc on b.EduCode = EmpEduc.EfeLevel
            WHERE EmpEduc.EfeEEID = empcomp.Eeceeid
            ORDER BY b.EduRank ASC
        ) AS tblDegrees ON tblDegrees.EfeEEID = empcomp.Eeceeid

【讨论】:

  • 好的,我会试一试。我知道你要去哪里。实际问题和我应该提供更多信息是所有信息都没有存储在同一个表中。以下是返回其度数和等级的查询示例:
  • 好的,我现在下班回家,到时看看。到时候可能会解决,否则我会对其进行一些脑损伤:-)
  • @Mike:你能试试我刚刚发布的查询吗?
【解决方案2】:

这不是最优雅的解决方案,但希望它至少能以某种方式帮助您。

create table #dataset (
licensurerank [datatype],
degreerank [datatype],
employeeid [datatype],
firstname varchar,
lastname varchar,
efeLevel  [datatype],
elclicenseid [datatype],
edutype1 [datatype],
edutype2 [datatype]
)

select distinct identity(int,1,1) [ID], EecEmpNo into #employeeList from EmpComp

declare
    @count int,
    @rows int,
    @employeeNo int

select * from #employeeList
set @rows = @@rowcount
set @count = 1

while @count <= @ROWS
    begin

select @employeeNo = EecEmpNo from #employeeList where id = @count

        insert into #dataset
        select top 2 a.EduRank as 'Licensure Rank',
           b.EduRank as 'Degree Rank',
           EmpComp.EecEmpNo, 
          EmpPers.EepNameFirst, 
           EmpPers.EepNameLast, 
           RTRIM(EmpEduc.EfeLevel),
           RTRIM(EmpLicns.ElcLicenseID),
           a.EduType,
           b.EduType
               from empcomp 
              join EmpPers on empcomp.eeceeid = EmpPers.eepEEID
              join EmpEduc on empcomp.Eeceeid = EmpEduc.EfeEEID
              join EmpLicns on empcomp.eeceeid = EmpLicns.ElcEEID
              join yvDegreeRanks a on a.EduCode = EmpLicns.ElcLicenseID
              join yvDegreeRanks b on b.EduCode = EmpEduc.EfeLevel
            where EmpComp.EecEmpNo = @employeeNo

    set @count = @count + 1
end

【讨论】:

    【解决方案3】:

    拥有员工表、学位类型(包括等级)、证书类型(包括等级)以及连接表employees_degrees 和employees_certs。 [最好将学位和证书放在一个带有 is_degree 标志的表中,if 它们的所有其他字段都相同。]您可以提取现有的字符串值并将它们替换为 FK id 到学位和证书表。

    查询本身更难,因为PARTITION BY 在 SQL Server 2000 中不可用(根据 Google)。 UW 的回答至少有两个问题:您需要LEFT JOINs,因为并非所有员工都拥有学位和证书,并且没有ORDER BY 可以显示您想要获得的最佳TOP 2 子查询在这种情况下特别难以使用。所以对此,我还不能给出答案。

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      相关资源
      最近更新 更多