Sql 如何计算连续非工作日来施加处罚

Sql 如何计算连续非工作日来施加处罚,sql,Sql,以下是示例数据-日期方面 EMPL 1052017 2052017 3052017 4052017 5052017 6052017 7052017 8052017 9052017 10052017 11052017 12052017 13052017 14052017 15052017 'PENALTY > 3' EMP1 P A A A A P P A A A A A P P

以下是示例数据-日期方面

EMPL    1052017 2052017 3052017 4052017 5052017 6052017 7052017 8052017 9052017 10052017    11052017    12052017    13052017    14052017    15052017    'PENALTY > 3'

EMP1        P   A   A   A   A   P   P   A   A   A   A   A   P   P   P   3

EMP2        A   A   P   A   A   A   A   A   A   A   P   A   P   P   A   4

EMP3        A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   12
SQL中的帮助获取连续的非当前天数作为惩罚天数。。。 逻辑:连续超过3次缺席,则处罚1次,如果5天,则处罚2次,如果6天,则处罚3次并继续

要求的结果如下

EMPL     P.DAYS         A.DAYS        PENALTY

EMP1       6              9             3

EMP2       3             11             4

EMP2       0             15            12

如果您使用的是ms sql server,则可以使用此方法

我假设您的表将值保持为垂直,如下所示

-- Create Table & Sample Data
DECLARE @MyTable TABLE(
    EMPL VARCHAR(10), 
    Value VARCHAR(10),
    [Date] DATETIME )

INSERT INTO @MyTable VALUES
('EMP1', 'P', '20170501'),
('EMP1', 'A', '20170502'),
('EMP1', 'A', '20170503'),
('EMP1', 'A', '20170504'),
('EMP1', 'A', '20170505'),
('EMP1', 'P', '20170506'),
('EMP1', 'P', '20170507'),
('EMP1', 'A', '20170508'),
('EMP1', 'A', '20170509'),
('EMP1', 'A', '20170510'),
('EMP1', 'A', '20170511'),
('EMP1', 'A', '20170512'),
('EMP1', 'P', '20170513'),
('EMP1', 'P', '20170514'),
('EMP1', 'P', '20170515'),
('EMP2', 'A', '20170501'),
('EMP2', 'A', '20170502'),
('EMP2', 'P', '20170503'),
('EMP2', 'A', '20170504'),
('EMP2', 'A', '20170505'),
('EMP2', 'A', '20170506'),
('EMP2', 'A', '20170507'),
('EMP2', 'A', '20170508'),
('EMP2', 'A', '20170509'),
('EMP2', 'A', '20170510'),
('EMP2', 'P', '20170511'),
('EMP2', 'A', '20170512'),
('EMP2', 'P', '20170513'),
('EMP2', 'P', '20170514'),
('EMP2', 'A', '20170515'),
('EMP3', 'A', '20170501'),
('EMP3', 'A', '20170502'),
('EMP3', 'A', '20170503'),
('EMP3', 'A', '20170504'),
('EMP3', 'A', '20170505'),
('EMP3', 'A', '20170506'),
('EMP3', 'A', '20170507'),
('EMP3', 'A', '20170508'),
('EMP3', 'A', '20170509'),
('EMP3', 'A', '20170510'),
('EMP3', 'A', '20170511'),
('EMP3', 'A', '20170512'),
('EMP3', 'A', '20170513'),
('EMP3', 'A', '20170514'),
('EMP3', 'A', '20170515')
要确定连续缺勤,可以使用此查询

;WITH CTE AS ( 
    SELECT  
        ( ROW_NUMBER() OVER(PARTITION BY EMPL ORDER BY [Date]) ) 
        -  ( ROW_NUMBER() OVER(PARTITION BY EMPL, Value ORDER BY [Date]) ) AS GRP
        , * 
    FROM @MyTable
),
CTE_GRP AS (
    SELECT EMPL, Value, GRP, COUNT(*) CNT 
    FROM CTE
    GROUP BY EMPL, Value, GRP 
)
SELECT EMPL,
    SUM( CASE WHEN Value ='P' THEN CNT ELSE 0 END ) [P.DAYS],
    SUM( CASE WHEN Value ='A' THEN CNT ELSE 0 END ) [A.DAYS],
    SUM( CASE WHEN (CNT - 3) > 0 THEN CNT - 3 ELSE 0 END) PENALTY
FROM
    CTE_GRP
GROUP BY EMPL
结果:

EMPL       P.DAYS      A.DAYS      PENALTY
---------- ----------- ----------- -----------
EMP1       6           9           3
EMP2       4           11          4
EMP3       0           15          12

大写锁定卡滞?请阅读,移除大写,并改进问题。我很好奇,你认为你的答案可能会有什么帮助。你真的认为OP会理解你所发布内容的复杂性吗?您也没有关于这个问题的上下文(这是家庭作业吗?它真的是SQL Server还是其他数据库引擎?)。这篇文章没有任何工作,除了“为我写代码”之外,没有任何具体的问题。你是对的,我做了一些假设,这让我的答案有点复杂。我做了一些更新。感谢您的通知。不确定您的更新是否有帮助:现在您已经添加了自己的表模型。老实说,最好让OP更具体,而不是花时间在完全未知的基础上发明答案。