基于SQL条件的数据集

时间:2011-05-18 14:33:33

标签: sql

我有一个我没有设计的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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

拥有员工表,学位类型(包括排名),证书类型(包括排名),以及联接表employees_degrees和employees_certs。 [将度和证书放在一个带有标志is_degree的表中可能会更好,如果所有其他字段都相同。]您可以提取现有的字符串值并将其替换为FK ID学位和证书表。

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