我有以下示例表:
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
的所有人员。这将是每月记录。
示例场景:
Person1
已注册Jan 01, 2018
,自Jan 01, 2019
提交第一张票证以来,从未提交过票证。这只会将Person1
视为Contributor
,直到2019年1月为止,但他是Jan 2018
至Dec 2018
之前的普通会员。Person1
在Feb 2019
提交了另一张票证。尽管他提交了新票,但由于他已经是Feb 2019
的{{1}} Contributor
的成员的Contributor
记录中
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
中的记录:
编辑:
添加了数据转储和分析点。
积分:
在2018-02年,PersonID 4成为了贡献者。除他以外,没有其他人提出罚单。这将为我们提供以下内容:
cte
在2018-03年度,除PersonID 5以外,没有其他人成为贡献者。同样,这将给我们另一行:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 2, Contributor: 1
在2018-04年,PersonID 6成为了贡献者:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 3, Contributor: 1
从2018-05到2019-01,没有其他人成为贡献者。因为他仍然是贡献者,所以这里不计算PersonID 6。
在2019-01年,PersonID 2和3成为了贡献者。这是他们的第一次入场券。同样,PersonID 6仍然是贡献者。这将给我们排:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 4, Contributor: 1
在2019-02年,PersonID 4回到了普通会员的身份,而不是贡献者,因为已经过去12个月了,从那以后他没有提交任何票证。无需为此。
在2019-03年,PersonID 5成为普通成员(第6点的逻辑相同)。第3个人提交了罚单,但他仍然是贡献者。总体而言,不需要任何行。
在2019-05年,第2个人提交了一张票,但他仍是参与者。第4个人提交了票证,他已经是普通会员,因此他现在是贡献者:
LeadID: 1, PeriodYear: 2019, PeriodMonth: 1, Contributor: 2
2019年6月,第5人成为贡献者:
LeadID: 1, PeriodYear: 2019, PeriodMonth: 5, Contributor: 1
在2019-07年,第6个人提交了一张票,但是自从他的上一张票于2019-01年提交以来,他仍然是参与者。 (多么忙的人!)
预期数据集:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 5 Contributor: 1
我希望这有助于澄清我的问题。
答案 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
)
每次创建票证时,都要检查是否需要更新contributorSince
和isContributor
。如果是,请进行更新,否则保持原样。
按personId和贡献者分组人员(因为月,年,...),其中isContributor设置为 true ,并且contributorSince
在您感兴趣的时间范围内。
isContributor
可能不是必需的。因为您可以只使用contributorSince