2017-05-10 2 views
0

Ich erstelle eine Abfrage, um (für die letzten 7 Tage) die tägliche Anzahl der Benutzer Follower in SQL Server zu erhalten. Ich habe diese Abfrage geschrieben, aber die erwartete Ausgabe wird nicht zurückgegeben. Momentan gibt es die Zählung zurück, aber es sind keine korrekten Daten.Erhalten Sie tägliche Benutzer Follower zählen mit Datum in den letzten 7 Tagen in SQL Server?

Hier ist meine Abfrage und bitte sagen Sie mir, wo mein Fehler ist. Ich habe 2 Tabellen in der Datenbank, 1. ist user und 2. ist 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 

Erwartete Ausgabe:

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 

Diese Beispieldaten aus meiner Datenbanktabellen ist:

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 

Diese Daten zeigen, diese Abfrage mit i 8 Zahl erhalten möchten, aber ich bin immer 0. so weiß ich nicht, wo ist mein Fehler jemand weiß, lass es mich wissen.

Antwort

1

Diese Abfrage,

;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] 
1

Ich gehe davon aus, dass Sie Ihre WHERE Klausel sein wollen:

 WHERE DATEDIFF(DAY, UF.InsertDateTime, DATEADD(DAY, T.i, GETDATE())) = 0 AND 
      UF.IsFollowed = 1 AND 
      (U.IsMUser = 1 OR U.IsFUser = 1) 

Dies behebt einen Logikfehler. Es kann die Ergebnisse beheben, die Sie erhalten.

Ich würde schreiben auch die Logik wie:

 WHERE CAST(UF.UF.InsertDateTime as DATE) = DATEADD(DAY, T.i, CAST(GETDATE() as DATE)) AND 
      UF.IsFollowed = 1 AND 
      (U.IsMUser = 1 OR U.IsFUser = 1) 

SQL Server einen Index verwenden, wenn ein Datum/Zeit auf ein Datum Gießen, so ist dies sargable während Ihrer Version nicht ist.

+0

immer Fehler falsche Syntax in der Nähe von '='. so was – coderwill

Verwandte Themen