计算最近12个月内提交票证的所有人员,每月分组

时间:2019-05-28 10:09:10

标签: sql sql-server tsql

我有以下示例表:

CREATE TABLE #tmp_persons (
    PersonID int primary key identity
    , FirstName varchar(max)
    , LastName varchar(max)
)

CREATE TABLE #tmp_tickets (
    TicketNum int primary key identity
    , Title varchar(max)
    , Descr varchar(max)
    , DateFiled datetime
    , SubmittedBy int FOREIGN KEY REFERENCES #tmp_persons(PersonID)
)

CREATE TABLE #tmp_assigned_lead (
    AssignmentID int primary key identity
    , PersonID int FOREIGN KEY REFERENCES #tmp_persons(PersonID) -- ID of the Lead
    , AssignedPersonID int FOREIGN KEY REFERENCES #tmp_persons(PersonID) -- ID of the person assigned
)

-- DATA DUMP
INSERT INTO #tmp_persons
VALUES
(1, 'John', 'Doe'), (2, 'Jane', 'Doe'),
(3, 'Carl', 'Smith'), (4, 'Jenny', 'Smith'),
(5, 'John', 'Wick'), (6, 'Stephanie', 'Mathews')

INSERT INTO #tmp_assigned_lead (PersonID, AssignedPersonID)
VALUES
(1, 2), (1, 3), (1, 4), (1, 5), (1, 6)

INSERT INTO #tmp_tickets (Title, Descr, DateFiled, SubmittedBy)
VALUES
('Ticket 1', 'blah', '01-01-2019', 2),
('Ticket 2', 'blah', '01-02-2019', 2),
('Ticket 3', 'blah', '05-01-2019', 4),
('Ticket 4', 'blah', '05-01-2019', 2),
('Ticket 5', 'blah', '06-01-2019', 5),
('Ticket 6', 'blah', '07-01-2019', 6),--
('Ticket 7', 'blah', '4-17-2018', 6),
('Ticket 8', 'blah', '12-30-2018', 6),
('Ticket 9', 'blah', '1-28-2019', 3),
('Ticket 10', 'blah', '3-16-2019', 3),
('Ticket 11', 'blah', '3-30-2018', 5),
('Ticket 12', 'blah', '2-4-2018', 4),
('Ticket 13', 'blah', '1-11-2019', 6),
('Ticket 14', 'blah', '9-5-2018', 6)

这就是要点:

  • #tmp_persons中的每个人都可以拥有一个“线索”,并将其存储在 关系表#tmp_assigned_lead
  • 一个人可以出票 存储在#tmp_tickets
  • 一个人提交票证时被称为Contributor,但是如果他在12个月内未提交另一张票证,则以普通会员身份返回。

现在,我的要求是,我希望统计在潜在客户的带领下每月已转换为Contributor的所有人员。这将是每月记录。

示例场景

  1. Person1已注册Jan 01, 2018,自Jan 01, 2019提交第一张票证以来,从未提交过票证。这只会将Person1视为Contributor,直到2019年1月为止,但他是Jan 2018Dec 2018之前的普通会员。
  2. Person1Feb 2019提交了另一张票证。尽管他提交了新票,但由于他已经是Feb 2019的{​​{1}}
  3. ,因此仍未被计入Contributor的成员的Contributor记录中
  4. Jan 2019已在Person2中注册并立即提交了票证。这使他/她成为Feb 23, 2019,并被计入Contributor月的“成为贡献者的成员”的计数中。

到目前为止,我已经提出了这个查询,将每人和每个月的票分组:

Feb 2019

这就是我遇到的障碍。我无法提出一个查询,该查询将返回潜在客户中成为SELECT SubmittedBy , MaxDate = MAX(DateFiled) , PeriodMonth = MONTH(DateFiled) , PeriodYear = YEAR(DateFiled) FROM #tmp_tickets GROUP BY SubmittedBy , MONTH(DateFiled) , YEAR(DateFiled) 的成员数量。

这是我到目前为止所拥有的。我将上述查询用作Contributors

CTE

这里的每个数据示例都是上面;with cte as ( SELECT SubmittedBy , MaxDate = MAX(DateFiled) , PeriodMonth = MONTH(DateFiled) , PeriodYear = YEAR(DateFiled) FROM #tmp_tickets GROUP BY SubmittedBy , MONTH(DateFiled) , YEAR(DateFiled) ) SELECT lead.PersonID , ContributorsCnt = COUNT(1) , PeriodMonth , PeriodYear FROM #tmp_assigned_lead lead INNER JOIN cte ON lead.AssignedPersonID = cte.SubmittedBy -- WHERE?? -- check if member has no tickets in the past 12 months GROUP BY lead.PersonID , PeriodMonth , PeriodYear 中的记录: cte

编辑

  

添加了数据转储和分析点。

积分

  1. 在2018-02年,PersonID 4成为了贡献者。除他以外,没有其他人提出罚单。这将为我们提供以下内容:

    cte

  2. 在2018-03年度,除PersonID 5以外,没有其他人成为贡献者。同样,这将给我们另一行:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 2, Contributor: 1

  3. 在2018-04年,PersonID 6成为了贡献者:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 3, Contributor: 1

  4. 从2018-05到2019-01,没有其他人成为贡献者。因为他仍然是贡献者,所以这里不计算PersonID 6。

  5. 在2019-01年,PersonID 2和3成为了贡献者。这是他们的第一次入场券。同样,PersonID 6仍然是贡献者。这将给我们排:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 4, Contributor: 1

  6. 在2019-02年,PersonID 4回到了普通会员的身份,而不是贡献者,因为已经过去12个月了,从那以后他没有提交任何票证。无需为此。

  7. 在2019-03年,PersonID 5成为普通成员(第6点的逻辑相同)。第3个人提交了罚单,但他仍然是贡献者。总体而言,不需要任何行。

  8. 在2019-05年,第2个人提交了一张票,但他仍是参与者。第4个人提交了票证,他已经是普通会员,因此他现在是贡献者:

    LeadID: 1, PeriodYear: 2019, PeriodMonth: 1, Contributor: 2

  9. 2019年6月,第5人成为贡献者:

    LeadID: 1, PeriodYear: 2019, PeriodMonth: 5, Contributor: 1

  10. 在2019-07年,第6个人提交了一张票,但是自从他的上一张票于2019-01年提交以来,他仍然是参与者。 (多么忙的人!

预期数据集

LeadID: 1, PeriodYear: 2018, PeriodMonth: 5 Contributor: 1

我希望这有助于澄清我的问题。

3 个答案:

答案 0 :(得分:2)

创建一个获取过去12个月内已提交票证列表的函数

ALTER FUNCTION func_isContributor(@dateFiled as DATE, @PersonID as INTEGER)
RETURNS  INTEGER
AS
BEGIN
    return 
        (SELECT
            count(*)
        FROM
            tmp_tickets
        WHERE 
            DateFiled BETWEEN  DATEADD(month, -12, @dateFiled) and  @dateFiled AND SubmittedBy = @PersonID)
END

然后检查该人是否有过去12个月的记录

; with cte as (
    SELECT 
        SubmittedBy,
        DateFiled,
        isCounted = case when dbo.func_isContributor(DateFiled,SubmittedBy) -1 = 0 then 1 else 0 END
    FROM
        tmp_tickets
)
SELECT
    lead.PersonID,
        ContributorCount = Count(1),
        PeriodMonth = MONTH(DateFiled),
        PeriodYear = YEAR(DateFiled)
FROM tmp_assigned_lead lead
INNER JOIN cte
    ON lead.AssignedPersonID = cte.SubmittedBy and cte.isCounted = 1
GROUP BY 
    lead.PersonID,
    MONTH(DateFiled),
    YEAR(DateFiled)

答案 1 :(得分:1)

您可以使用where条件

DATEDIFF(MONTH, DateFiled, GETDATE()) <=12
group by MONTH(DateFiled)

答案 2 :(得分:0)

尝试保留有关某人是否为贡献者的记录。创建另一个表以保留此记录或进行修改

CREATE TABLE #tmp_persons (
PersonID int primary key identity
, FirstName varchar(max)
, LastName varchar(max)
, isContributor int
, contributorSince datetime 

每次创建票证时,都要检查是否需要更新contributorSinceisContributor。如果是,请进行更新,否则保持原样。

按personId和贡献者分组人员(因为月,年,...),其中isContributor设置为 true ,并且contributorSince在您感兴趣的时间范围内。

isContributor可能不是必需的。因为您可以只使用contributorSince