我正在创建一个查询,以获取(过去7天)SQL Server中每日用户关注者的数量。我写了这个查询,但它没有返回预期的输出。现在它返回计数,但它不是正确的数据。
这是我的疑问,请告诉我我的错误在哪里。我在数据库中有2个表,第1个是user
,第2个是userfollowers
。
SELECT
CAST(DATEADD(DAY, T.i, GETDATE()) AS DATE) AS DateColumn,
uf.TotalCount
FROM
(VALUES (0), (-1), (-2), (-3), (-4), (-5), (-6)) AS T(i)
OUTER APPLY
(SELECT
COUNT(UF.InsertDateTime) AS TotalCount
FROM
userfollowers UF
INNER JOIN
user U on U.UserId = UF.UserFollowerId
WHERE
DATEDIFF(DAY, UF.InsertDateTime, DATEADD(DAY, T.i, GETDATE())) = 0
AND UF.IsFollowed = 1
AND U.IsMUser = 1 OR U.IsFUser = 1) uf
预期产出:
DateColumn | Count
10-05-2017 8
09-05-2017 05
08-05-2017 20
07-05-2017 10
06-05-2017 30
05-05-2017 50
04-05-2017 50
这是我数据库表中的示例数据:
UFID | UserId | UserFolloresId | IsFollowres | InsertDateTime
1 1110 100 1 2017-05-10 11:26:27.500
2 1120 100 1 2017-05-10 11:26:27.500
3 1130 100 1 2017-05-10 11:26:27.500
4 1200 100 1 2017-05-10 11:26:27.500
5 1110 101 1 2017-05-10 11:26:27.500
6 1120 101 1 2017-05-10 11:26:27.500
7 1130 101 1 2017-05-10 11:26:27.500
8 1200 101 1 2017-05-10 11:26:27.500
这个数据显示这个查询我希望得到8个计数,但我得到0.所以我不知道我的错误在哪里,任何人都知道请告诉我。
答案 0 :(得分:1)
我假设您希望<body onload="Slider();">
<div class="slider">
<img id="1" src="img/home/01.jpg" border="0" alt="omage" class="img-responsive">
<img id="2" src="img/home/02.jpg" border="0" alt="omage" class="img-responsive">
<img id="3" src="img/home/03.jpg" border="0" alt="omage" class="img-responsive">
<img od="4" src="img/home/04.jpg" border="0" alt="omage" class="img-responsive">
</div>
</body>
子句为:
WHERE
这修复了一个逻辑错误。它可能会修复你得到的结果。
我也会将逻辑编写为:
WHERE DATEDIFF(DAY, UF.InsertDateTime, DATEADD(DAY, T.i, GETDATE())) = 0 AND
UF.IsFollowed = 1 AND
(U.IsMUser = 1 OR U.IsFUser = 1)
在将日期/时间转换为日期时,SQL Server将使用索引,因此这是可搜索的,而您的版本不是。
答案 1 :(得分:1)
尝试此查询,
;WITH [CTE_DATE]
AS
(
SELECT CAST(GETDATE() AS DATE) AS [DATE]
UNION ALL
SELECT DATEADD(DD,-1,[DATE]) FROM [CTE_DATE] WHERE DATEDIFF(DD,[DATE],GETDATE()) <= 5
)
SELECT [DATE] ,(SELECT COUNT(*)
FROM userfollowers INNER JOIN [user] U on U.UserId = UF.UserFollowerId UF
WHERE CAST(UF.InsertDateTime AS DATE) = [DATE]
AND UF.IsFollowed = 1 and (U.IsMUser = 1 or U.IsFUser = 1)) AS TotalCount
FROM [CTE_DATE]