【问题标题】:SQL Server: How can I SELECT FROM TABLE TO Other Format?SQL Server:如何从表中选择其他格式?
【发布时间】:2010-03-23 16:04:49
【问题描述】:

我有表 A。如何从表 A 中选择表 B 格式?

Table A

Employee Name Effective Date FieldType     FieldValue
Maung Mya           1/1/2005 Title         Project Engineer
Maung Mya           1/1/2005 Department    IT Department
Maung Mya           1/1/2007 Title         Assist Project Manager
Kyaw Kyaw           1/1/2006 Title         Software Engineer
Kyaw Kyaw           1/1/2006 Department    IT Department

Table B

Effective Date Employee Name Title                  Department
1/1/2007       Maung Mya     Assist Project Manager IT Department
1/1/2006       Kyaw Kyaw     Software Engineer      IT Department

【问题讨论】:

    标签: sql-server-2005 select


    【解决方案1】:

    看起来你想要这样的东西:

    SELECT A.[Effective Date],
           A.[Employee Name],
           A.FieldValue AS Title,
           A2.FieldValue AS Department
    FROM A INNER JOIN
         A AS A2
         ON A.[Employee Name] = A2.[Employee Name] AND
            A.[Effective Date] = A2.[Effective Date] AND
            A.FieldType = 'Title' AND
            A2.FieldType = 'Department'
    WHERE A.[Effective Date] = (
        SELECT MAX([Effective Date])
        FROM A AS A3
        WHERE A3.[Employee Name] = A.[Employee Name] AND A3.FieldType = 'Title')
        AND A2.[Effective Date] = (
        SELECT MAX([Effective Date])
        FROM A AS A4
        WHERE A4.[Employee Name] = A2.[Employee Name] AND A3.FieldType = 'Department')
    

    【讨论】:

    • 当我在您的陈述中进行测试时,标题字段在结果中为 NULL。并且第一条记录显示 Maung Mya “项目工程师”而不是“协助项目经理”的第一个标题。
    • 好的,我添加了一个 WHERE 子句,应该会有所帮助。
    • 谢谢,根据您的回答,我得到了我想要检索的答案!
    【解决方案2】:

    编辑:RedsDevils 我已经编辑了我的代码并使用您的示例对其进行了测试。现在应该可以工作了

    考虑到同一名员工可能会更换部门,或通过他的职业生涯获得晋升,我的两个加入者会为每种类型寻找最新生效日期

    SELECT  derived.[Effective Date], 
            derived.[Employee Name],
            title1.[FieldValue] AS Title, 
            dept1.[FieldValue] AS Department
    FROM 
        (
            SELECT MAX([Effective Date]) AS [Effective Date], [Employee Name] 
            FROM TableA
            GROUP BY [Employee Name] 
        ) derived
    
        -- Inner Join for TITLE
        INNER JOIN TableA title1 ON derived.[Employee Name] = title1.[Employee Name]
        AND title1.FieldType = 'Title'
        AND title1.[Effective Date] = (SELECT MAX(title2.[Effective Date]) 
                                    FROM TableA title2 
                                    WHERE title1.[Employee Name] = title2.[Employee Name] 
                                    AND title2.FieldType = 'Title') 
    
        -- Inner Join for DEPARTMENT
        INNER JOIN TableA dept1 ON derived.[Employee Name] = dept1.[Employee Name]
        AND dept1.FieldType = 'Department'
        AND dept1.[Effective Date] = (SELECT MAX(dept2.[Effective Date]) 
                                    FROM TableA dept2 
                                    WHERE dept1.[Employee Name] = dept2.[Employee Name] 
                                    AND dept2.FieldType = 'Department') 
    

    我首先创建了一个派生表来获取 MAX 生效日期和员工姓名,并将其命名为“派生”。然后我创建加入以获得最后知道的Title和Department。

    【讨论】:

    • 您的 Statements 结果 10 条记录。我只需要表 B 中的 2 条记录。
    • 抱歉,很匆忙,但我想了解标题和部门的 MAX(effective_date) 原则。如果我有时间吃午饭,我会完全解决它。
    【解决方案3】:

    是的,我明白了!基于Gabe's answer,我可以检索我想要的格式并且只有2条记录。谢谢大家!答案如下。

    SELECT  TableA.[Effective Date],  TableA.[Employee Name],  TableA.FieldValue AS Title,A2.FieldValue AS Department FROM TableA INNER JOIN  TableA AS A2 ON TableA.[EmployeeName] = A2.[EmployeeName] AND  TableA.[EffectiveDate] = (SELECT MAX([EffectiveDate]) FROM TableA AS A3 WHERE A3.[EmployeeName] = TableA.[EmployeeName] AND A3.FieldType = 'Title') AND  TableA.FieldType = 'Title' AND  A2.FieldType = 'Department'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多