私はテーブルを持っています:
Table A
-------
SubscriberId int
ContentId int
SendDate DateTime
Sample Data
------------
1 190159 2012-11-07 00:00:00.000
1 190160 2012-11-07 00:00:00.000
1 190160 2012-11-07 00:00:00.000
1 190160 2012-11-07 00:00:00.000
1 190160 2012-11-07 00:00:00.000
1 190160 2012-11-07 00:00:00.000
1 190160 2012-11-07 00:00:00.000
1 190160 2012-11-19 00:00:00.000
2 190160 2012-11-19 00:00:00.000
2 190160 2012-10-19 00:00:00.000
2 190160 2012-10-01 00:00:00.000
2 190160 2011-10-01 00:00:00.000
2 190160 2011-10-01 00:00:00.000
2 190160 2011-10-01 00:00:00.000
2 190160 2011-10-19 00:00:00.000
2 190160 2011-10-18 00:00:00.000
2 190160 2011-10-17 00:00:00.000
2 190161 2011-10-20 00:00:00.000
2 190161 2011-10-01 01:01:01.000
上記の表はフラットな表であり、正規化されていません (私はそのままにしておくつもりです)。
必要な出力は、各 SubscriberId について、Senddate YEARLY、MONTHLY、WEEKLY の ContentId の数を数え、特定の方法でフォーマットする必要があることです。
Subscriber ID YEARLYValidData
1 190159,1|190160,7
2 190160,9|190161,2
上記の結果は部分的な結果です。つまり、YEARLY データで機能する結果が得られましたが、2 番目の列には MONTHLYValiddata (つまり、GetDate() から 30 日以内に収まるコンテンツ) が必要であり、WEEKLYValidData (つまり、そのコンテンツ) も必要です。 GetDate() から 7 日後)
以下のクエリでは、望ましい結果が得られますが、それぞれが個別に表示されます。
DECLARE NumberOfDays int = 365
SELECT MAIN.SubscriberId,
STUFF((
SELECT '|' +
(CAST(SUB.ContentId AS nvarchar(10)) + ',' +
CAST(Count(ContentId) as nvarchar(100)))
FROM TABLEA SUB
Where
SUB.SubscriberId = MAIN.SubscriberId
GROUP BY ContentId
FOR XML PATH('')
), 1, 1, '' )
AS [Result]
FROM TABLEA MAIN
WHERE
DATEADD(DAY, DATEDIFF(DAY, 0, SendDate), 0) >=
DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) - @NumberOfDays
単一の Select ステートメントで以下の結果を取得するにはどうすればよいですか。
Subscriber ID YEARLYValidData MONTHLYValidData WEEKLYValidData
1 190159,1|190160,7 190159,1|190160,7 190159,1|190160,7
2 190160,9|190161,2 190160,9|190161,2 190160,1
TEMP テーブル (またはテーブル変数) を使用して、年次/月次/週次のデータを入力し続けることができることはわかっていますが、可能であれば、より効率的なものを使用したいと思いますか?