Sql 按天计算参与人数
我有一个解决这个问题的办法,但我不知道这是不是最好的办法,所以我正在寻找更好的替代方案 我试图计算两周之间每天的参与人数 两个人在两周内参加一项运动 人A b人 第一周Sql 按天计算参与人数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个解决这个问题的办法,但我不知道这是不是最好的办法,所以我正在寻找更好的替代方案 我试图计算两周之间每天的参与人数 两个人在两周内参加一项运动 人A b人 第一周 Day 1: A, b DAY 2: A, b Day 3: a, b Day 4: a, b Day 5: a, b 第2周 Day 1: A, B DAY 2: A DAY 3: A Day 4: A, B Day 5: B 所以我想知道与前一周相比,我失去了多少参与者 所以输出看起来像 损失:第一天:0,第二天:1,第
Day 1: A, b
DAY 2: A, b
Day 3: a, b
Day 4: a, b
Day 5: a, b
第2周
Day 1: A, B
DAY 2: A
DAY 3: A
Day 4: A, B
Day 5: B
所以我想知道与前一周相比,我失去了多少参与者
所以输出看起来像
损失:第一天:0,第二天:1,第三天:1,第四天:0,第五天:1
所以我现在做的是在where caluse和using not in中进行子查询,并在这些日子中循环
DECLARE @days table (d TIN
INSERT INTO @days
VALUES(1), (2), (3), (4), (5), (6), (7)
SELECT COUNT(Person), DayOfWeek
FROM participation
WHERE WEEK = Week1
AND DAY = @day
AND PERSON NOT IN (SELECT Person
FROM participation
WHERE WEEK = Week2
and Day = @day)
算出
使用了与下面答案非常相似的方法
WITH CTE AS
(SELECT dayofweek, person
FROM Participation
Where week = week1)
SELECT DayOfWeek, COunt(CTE.Person), COunt(a.Person)
FROM CTE
LEFT JOIN (SELECT DayOfWeek, Person
FROM Participation
where week = week2)a
ON a.Person = CTE.Person
and a.dayofweek = cte.dayofweek
我把它放在一个有计算列的表格里,然后得到每天的最小值,我就有了我的答案。感谢您的帮助您希望避免SQL中的循环-尽管我在代码中看不到所述循环。您是否使用光标填充@day 无论如何,我不确定您的数据类型或表结构,但假设week是一个字符串,并且所有内容都存储在一个参与表中,那么这将导致您从第1周到第2周的损失:
;with cte_people ( week, DayOfWeek, person_count)
as
(
select WEEK, DayOfWeek, count(person)
from participation
group by WEEK, DayOfWeek
)
select c1.DayOfWeek, c1.person_count - c2.person_count as loss
from cte_people c1
inner join cte_people c1
on c2.DayOfWeek = c1.DayOfWeek
and c2.week = 'Week2'
where c1.week = 'Week1'
那不行。天=天?你有一张@天的桌子。WEEK=Week1?@狗仔队很抱歉,它没有添加我在其中的代码块。它不会让我添加循环查询,但我发现它与您的类似,使用CTE作为SELECT DayOfWeek,Person FROM Participation,其中WEEK=Week1选择CTE.Person,CTE.DayOfWeek,Countcte.Person,COUNTa.Person FROM CTE LEFT JOIN SELECT Dayofweek,Person FROM participation其中Dayofweek=week2 a on a.Person=CTE.Person和a.Dayofweek=CTE.Dayofweek我将其插入一个带有计算列的表中,以每天的分钟为单位,viola得到了我想要的减去循环的结果