2016-08-01 19 views

Antwort

1

dies versuchen,

SELECT d.*, dp.dept, u.users_created 
FROM dbo.dates d 
CROSS APPLY (SELECT DISTINCT dept FROM dbo.users) as dp 
OUTER APPLY (SELECT COUNT(*) users_created 
       FROM dbo.users u 
       WHERE u.dept = dp.dept 
       AND u.created_at >= d.month_start 
       AND u.created_at < d.next_month_start 
      ) as u 
2

Machen Sie einen einfachen SELECT COUNT von bestimmten Daten?

SELECT month_start, next_month_start, sum(cnt) as users, dept FROM 
(SELECT CASE WHEN created_at<=next_month_start AND created_at>=month_start THEN 1 ELSE 0 END as cnt, 
users.*, month_start, next_month_start FROM users 
CROSS JOIN dates) as S1 
GROUP BY dept, month_start, next_month_start ORDER BY dept DESC 
+0

Ich verstehe nicht, wie das zu tun. Könnten Sie mir helfen, eine Abfrage zu schreiben, die das Ergebnis in meiner Frage generiert? – user130268

+0

Sorry, Abfrage hinzugefügt. Funktioniert bei mir. –

1
SELECT D.id dates_id,D.month_start dates_start,D.next_month_start dates_next_month_start,count(U.id) user_created,U.dept 

FROM dates D 
LEFT JOIN users U ON concat(year(U.created_at) ,"-",month(U.created_at)) = concat(year(D.month_start) ,"-",month(D.month_start)) 

GROUP BY concat(year(D.month_start) ,"-",month(D.month_start)) ,concat(year(D.next_month_start) ,"-",month(D.next_month_start)) ; 

Es folgt die aus

setzen
id month_start     next_month_start    user_created dept 
7 February, 01 2016 00:00:00 March, 01 2016 00:00:00  0    (null) 
6 March, 01 2016 00:00:00  April, 01 2016 00:00:00  2    sales 
5 April, 01 2016 00:00:00  May, 01 2016 00:00:00   3    sales 
4 May, 01 2016 00:00:00  June, 01 2016 00:00:00  0    (null) 
3 June, 01 2016 00:00:00  July, 01 2016 00:00:00  2    hr 
2 July, 01 2016 00:00:00  August, 01 2016 00:00:00  0    (null) 
1 August, 01 2016 00:00:00 September, 01 2016 00:00:00 0    (null) 
+0

Dies ist nicht das Gleiche wie ich es verlangte. Beachten Sie, dass ich die gesamte "Daten" -Tabelle für jede Abteilung in der Tabelle "Benutzer" wiederholen muss. Siehe die ASCII-Tabelle in meiner Frage. Das ist, was ich will. – user130268

+0

Verwenden Sie auch SQL Server als Datenbank? Ich habe Syntaxfehler, wenn ich versuche, es auszuführen. Es scheint, dass "_" in SQL Server nicht gültig ist. – user130268

+0

Ich verwende hier http://sqlfiddle.com/#!9/fd212/7 – Athar

1

Haben Sie so etwas wie dieses brauchen?

SELECT sum(cnt), month_start, next_month_start, dept 
FROM 
(
    SELECT 
    CASE WHEN created_at<=next_month_start AND created_at>=month_start THEN 1 ELSE 0 END cnt, 
    users.*, month_start, next_month_start 
    FROM users 
    CROSS JOIN dates 
) sbt 
GROUP BY month_start, next_month_start, dept 
Verwandte Themen