Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按天计算参与人数_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 按天计算参与人数

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,第

我有一个解决这个问题的办法,但我不知道这是不是最好的办法,所以我正在寻找更好的替代方案

我试图计算两周之间每天的参与人数

两个人在两周内参加一项运动

人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,第三天: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得到了我想要的减去循环的结果