2013-06-22 97 views
0

我正在寻找关于重新分解下面显示的代码的建议。您会注意到,标识为“DATAPOINT2”和“DATAPOINT3”的代码与简化非常相似和成熟。但是我正在试图想想如何优雅地结合'DATAPOINT2'和'DATAPOINT3'。重构SQL代码

CREATE TABLE Employee (EmployeeId INTEGER, BonusPaidOn DATE, Status VARCHAR(50)); 

INSERT INTO Employee VALUES (1, '01-JAN-2013', 'Paid in Full'); 
INSERT INTO Employee VALUES (2, '01-FEB-2013', 'Paid in Full'); 
INSERT INTO Employee VALUES (2, '01-MAR-2013', 'Partial Payment'); 
INSERT INTO Employee VALUES (2, '01-APR-2013', 'Partial Payment'); 
INSERT INTO Employee VALUES (3, '01-APR-2013', 'Refused'); 
COMMIT; 

WITH 
DATAPOINT1 AS 
    (SELECT DISTINCT 
     EmployeeId 
    FROM 
     Employee 
) 
,DATAPOINT2 AS 
    (SELECT 
     EmployeeId 
     ,Status 
     ,MAX(BonusPaidOn) AS BonusPaidOn 
    FROM 
     Employee 
    WHERE 
    Status IN ('Paid in Full','Partial Payment', 'Refused') 
    GROUP BY 
    EmployeeId, Status 
) 
,DATAPOINT3 AS 
    (SELECT 
     EmployeeId 
     ,MAX(BonusPaidOn) AS BonusPaidOn 
    FROM 
     DATAPOINT2 temp 
    WHERE 
     Status IN ('Paid in Full','Partial Payment') 
    GROUP BY 
     EmployeeId 
) 
SELECT 
    A.EmployeeId 
    ,B.BonusPaidOn AS LastBonusPaidInFullOn 
    ,C.BonusPaidOn AS LastBonusPaidOn 
    ,D.BonusPaidOn AS LastBonusRefusedOn 
FROM 
    DATAPOINT1 A 
LEFT OUTER JOIN DATAPOINT2 B ON A.EmployeeId = B.EmployeeId AND B.Status = 'Paid in Full' 
LEFT OUTER JOIN DATAPOINT3 C ON A.EmployeeId = C.EmployeeId 
LEFT OUTER JOIN DATAPOINT2 D ON A.EmployeeId = D.EmployeeId AND D.Status = 'Refused'; 

请求为预期的结果作出:

EmployeeId LastBonusPaidInFullOn LastBonusPaidOn LastBonusRefusedOn 
---------- --------------------- --------------- ------------------ 
     3           01-APR-13 
     1 01-JAN-13    01-JAN-13 
     2 01-FEB-13    01-APR-13 
+0

你应该包括SQL的意图是什么。为给定的输入正确输出会很有用。 –

回答

1

查询似乎很复杂。我认为以下是你想要的 - 为每个状态类型创建最后一个日期:

SELECT EmployeeId, 
     max(case when Status IN ('Paid in Full') then BonusPaidOn 
      end) as LastBonusPaidInFullOn 
     max(case when Status IN ('Partial Payment') then BonusPaidOn 
      end) as LastBonusPaidOn 
     max(case when Status IN ('Refused') then BonusPaidOn 
      end) as BonusPaidPartialRefused 
FROM Employee 
WHERE Status IN ('Paid in Full', 'Partial Payment', 'Refused') 
GROUP BY EmployeeId 
+0

我不太清楚你如何评价优雅,但我确实喜欢Gordon的SQL。我希望他不介意我调整了一下,以获得我期待的结果。 – user1356996

+0

@ user1356996。 。 。变化很好。很高兴我能够提供帮助。 –