web-dev-qa-db-ja.com

SQL Serverの計算フィールドを含む、グループ化された日次、週次、月次のレポートを作成する方法

SQL Server(2012)を使用しており、以下の2つの(簡略化された)テーブルを使用して、3つの個別のレポート(日次、週次、月次)を作成し、次の計算フィールドを含めるにはどうすればよいですか。

1. new users created in this period
2. total number of users at this time


**Users**
userID          int
name            varchar(80)
userCreated     datetime


**Orders**
orderID         int
userID          int
orderCreated    datetime

私はこのコードをいじっています:

SELECT CAST(DATEPART(dd,userCreated) as VARCHAR(2)) + '/' + CAST(DATEPART(mm,userCreated) AS VARCHAR(2)) + '/' + CAST(DATEPART(yyyy,userCreated) AS VARCHAR(4)) [Date],
    count(*) newSignUps,
    (select count(*) from users u2 WHERE u2.userCreated < u1.userCreated)
FROM users u1
WHERE userCreated BETWEEN '05/01/2014 00:00:00.000' and '05/31/2014 23:59:59.000'
GROUP BY DATEPART(dd,userCreated), DATEPART(mm,userCreated), DATEPART(yyyy,userCreated),userCreated

ただし、何かを表示するには、グループ化に「userCreated」フィールドを追加する必要があります...

私が示す必要のあるレポートの場合:

毎日:

date          new sign ups        users in system
17/03/2013    10                  100
18/03/2013    4                   104
19/03/2013    8                   112

毎週:

week
13             8                   40
14             2                   42
15             5                   47

毎月:

Jan            3                   54
Feb            9                   63
Mar            2                   65

これが理にかなっているといいのですが?ありがとうございました...

5
andym0908

あなたの質問を正しく理解したかどうかはわかりませんが、これにより、1日に作成されたすべてのユーザーがわかります。

SELECT year(userCreated), month(userCreated), day(userCreated), count(*)
FROM Users
GROUP BY year(userCreated), month(userCreated), day(userCreated)

これは月ごとに:

SELECT year(userCreated), month(userCreated), count(*)
FROM Users
GROUP BY year(userCreated), month(userCreated)

そしてこれは週ごとに:

SELECT year(userCreated), datepart(week, userCreated), count(*)
FROM Users
GROUP BY year(userCreated), datepart(week, userCreated)

不足している合計フィールドに応じて編集します。ここでは、月のクエリの例を示します。

SELECT year(userCreated), month(userCreated), count(*) AS NewCount,
(SELECT COUNT(*) FROM Users u2 WHERE 
    CAST(CAST(year(u1.userCreated) AS VARCHAR(4)) + RIGHT('0' + CAST(month(u1.userCreated) AS VARCHAR(2)), 2) + '01' AS DATETIME) > u2.userCreated) AS TotalCount
FROM Users u1
GROUP BY year(userCreated), month(userCreated)

これが他の2つのクエリに役立つことを願っています。

6
schlonzo

[〜#〜]毎日[〜#〜]

select count(UserId),userCreated     
from User WHERE CONDITION group by CreatedOn

[〜#〜]毎月[〜#〜]

select count(UserId),
LEFT(CONVERT(varchar, userCreated ,112),6) from User 
WHERE CONDITION  group by LEFT(CONVERT(varchar, userCreated ,112),6) 

OR

select count(UserId),
month(userCreated ) 
from User group by month(userCreated ) 

[〜#〜]毎週[〜#〜]

select count(UserId),
DATEPART( wk, userCreated) 
from User WHERE CONDITION  group by DATEPART( wk, userCreated     ) 

新規ユーザー数と既存ユーザー数の両方(毎月行った)

select new,
(select count(UserId) from User where month(userCreated)<=monthwise) as total,
monthwise
FROM (

select count(UserId) as new,

month(userCreated)as monthwise from User group by month(userCreated) 
)tmp
6
sumit