0

私はテーブルを持っています:

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 テーブル (またはテーブル変数) を使用して、年次/月次/週次のデータを入力し続けることができることはわかっていますが、可能であれば、より効率的なものを使用したいと思いますか?

4

1 に答える 1

1

よくわかりませんが、最終的な答えでなくても、これで少し先に進むことができます。

SELECT  C.Interval,
        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
        CROSS JOIN
        (    SELECT 356 As Days, 'Year' As Interval
             UNION ALL 
             SELECT 30 Days, 'Month' As Interval
             UNION ALL 
             SELECT 7 Days, 'Week' As Interval
        ) C
        WHERE 
        DATEADD(DAY, DATEDIFF(DAY, 0, SendDate), 0) >= 
        DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) - C.Days
于 2012-11-19T23:58:43.707 に答える