0

2つのテーブルがあります

Users:Id(PK int), Username(varchar (50))
Emails:Id(PK int), UserId(FK int), Subject(varchar(50)), Content(varchar(250)), SentAt(datetime)

各ユーザーが送信した電子メールの数を、日ごとにグループ化し、その日に送信された電子メールの総数で並べ替えて表示する必要があります。例を挙げたほうがいいです:

Date     |User       |Total
---------|-----------|-------
2012-4-5 |username1  |7
2012-4-5 |username2  |2
2012-4-2 |username1  |3
2012-3-24|username1  |12
2012-3-24|username5  |2

私はこれを試しましたが、明らかに機能していません。

ALTER PROCEDURE spGetStatistics
AS
SELECT e.SentAt, u.Username, ( SELECT COUNT(*) FROM Emails e2 WHERE e2.SentAt=e.SentAt AND e2.UserID=u.UserID ) AS Total
FROM Emails e INNER JOIN Users u ON e.UserID=u.UserID
GROUP BY e.SentAt
ORDER BY Total

LE:

Using the solution provided by Adrian which is:

    SELECT CAST (e.SentAt AS date), u.Username,  COUNT(*) AS Total
    FROM Emails e INNER JOIN Users u ON e.UserID=u.UserID
    GROUP BY CAST (e.SentAt AS date), u.Username
    ORDER BY Total

I got this:
    Date       |User       |Total
    -----------|-----------|-------
    2012-09-08 |username1  |1
    2012-09-07 |username2  |2
    2012-09-08 |username2  |2

instead of

    Date       |User       |Total
    -----------|-----------|-------
    2012-09-08 |username2  |2
    2012-09-08 |username1  |1
    2012-09-07 |username2  |2


It seems to be working like this:
SELECT CAST (e.SentAt AS date), u.Username,  COUNT(*) AS Total
FROM Emails e INNER JOIN Users u ON e.UserID=u.UserID
GROUP BY CAST (e.SentAt AS date), u.Username
ORDER BY CAST (e.SentAt AS date) DESC, Total DESC
4

2 に答える 2

1

これは行う必要があります:

SELECT 
    cast(e.SentAt as Date) [Date], 
    u.Username,
    COUNT(*) AS Total
FROM Emails e INNER JOIN Users u ON e.UserID=u.UserID
GROUP BY cast(e.SentAt as Date), u.Username
ORDER BY 3

これで、メールを送信しなかったユーザーが非表示になります(count = 0)。それらを含めたい場合は、これに切り替える必要があります。

SELECT 
    cast(e.SentAt as Date) [Date], 
    u.Username,
    COUNT(e.Id) AS Total
FROM Users u LEFT JOIN Emails e ON e.UserID=u.UserID
GROUP BY cast(e.SentAt as Date), u.Username
ORDER BY 3

アップデート

希望する順序については、次のようにする必要があります。

SELECT 
    cast(e.SentAt as Date) [Date], 
    u.Username,
    COUNT(*) AS Total
FROM Emails e INNER JOIN Users u ON e.UserID=u.UserID
GROUP BY cast(e.SentAt as Date), u.Username
ORDER BY cast(e.SentAt as Date), Total DESC
于 2012-08-09T19:27:00.973 に答える
0
SELECT e.SentAt, u.Username, count(e.Id) AS Total
FROM Emails e
  INNER JOIN Users u ON (e.UserID = u.UserID)
GROUP BY e.SentAt, u.Username
ORDER BY Total
于 2012-08-09T19:28:07.557 に答える