3

CRM の「ケース」には、4 つのオプションがある「ステータス」というフィールドがあります。

CRM でレポートを作成しようとしています。このレポートは、1 年間の毎週 (各行は別の週) でテーブルを埋め、各ステータス オプションを持つケースの数をカウントします (列は各ステータスになります)。オプション)。

テーブルは次のようになります

         Status 1    Status 2    Status 3
Week 1       3         55          4
Week 2       5         23          5
Week 3       14        11          33

これまでのところ、次のものがあります。

SELECT 
    SUM(case WHEN status = 1 then 1 else 0 end) Status1,
    SUM(case WHEN status = 2 then 1 else 0 end) Status2,
    SUM(case WHEN status = 3 then 1 else 0 end) Status3,
    SUM(case WHEN status = 4 then 1 else 0 end) Status4,
    SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM [DB].[dbo].[Contact]

これにより、次のことがわかります。

Status 1   Status 2   Status 3  
   2         43          53

ここで、これを過去 1 年間の 52 行に分割し、これらの結果を日付 (Contact テーブルの列) でフィルター処理する必要があります。私は SQL クエリと CRM に少し慣れていません。ここで何か助けていただければ幸いです。

ここに私の進行状況とサンプル データを含む SQLFiddle があります: http://sqlfiddle.com/#!2/85b19/1

4

2 に答える 2

2

範囲でグループ化したいようです。秘訣は、各範囲(1年に1つ)を表す新しいフィールドを作成し、それによってグループ化することです。

また、無限の範囲の日付が必要なように思われるため、marc_sには、一般的な方法で日付を使用してgroupbyトリックを実行する方法の概要があります。日付範囲内の頻度によるSQLgroup

于 2012-11-07T19:17:54.760 に答える
1

それでは、これを分解しましょう:

連絡先ごとに、その連絡先に登録されたケース数の週ごとの内訳を示すレポートを作成したいと考えています。このレポートは、それぞれ 1 つの 3 つの列に分割されていますStateCode

この場合、連絡先ごとに 52 個 (またはそれくらい) の日付レコードが必要になります。カレンダーのようなリクエストの場合は、クエリを実行できる別のカレンダー テーブルを用意することをお勧めします。Dan Guzman は、クエリで使用する便利なカレンダー テーブルを作成するブログ エントリを持っています。

WITH WeekNumbers AS
(
    SELECT
        FirstDateOfWeek,
         -- order by first date of week, grouping calendar year to produce week numbers
        WeekNumber = row_number() OVER (PARTITION BY CalendarYear ORDER BY FirstDateOfWeek)
    FROM
        master.dbo.Calendar -- created from script
    GROUP BY
        FirstDateOfWeek,
        CalendarYear
), Calendar AS
(
    SELECT
        WeekNumber =
        (
            SELECT
                WeekNumber
            FROM
                WeekNumbers WN
            WHERE
                C.FirstDateOfWeek = WN.FirstDateOfWeek
        ),
        *
    FROM
        master.dbo.Calendar C
    WHERE
        CalendarDate BETWEEN '1/1/2012' AND getutcdate()
)

SELECT
    C.FullName,
    ----include the below if the data is necessary
    --Cl.WeekNumber,
    --Cl.CalendarYear,
    --Cl.FirstDateOfWeek,
    --Cl.LastDateOfWeek,
    'Week: ' + CAST(Cl.WeekNumber AS VARCHAR(20))
    + ', Year: ' + CAST(Cl.CalendarYear AS VARCHAR(20)) WeekNumber
FROM
    CRM.dbo.Contact C
    -- use a cartesian join to produce a table list
    CROSS JOIN
        (
            SELECT
                DISTINCT WeekNumber,
                CalendarYear,
                FirstDateOfWeek,
                LastDateOfWeek
            FROM
                Calendar
        ) Cl
ORDER BY
    C.FullName,
    Cl.WeekNumber

これは、Ben がリンクしているソリューションとは異なります。Marc のクエリは、一致する値がある週のみを返しますが、アクティビティがない週も表示したい場合と表示したくない場合があるためです。

上記のように、連絡先のコア テーブルを週ごとに分割 (または特定の期間に合わせて変更) したら、それぞれのサブクエリを追加するだけStateCodeで、以下の最終クエリのように列の内訳を確認できます。

WITH WeekNumbers AS
(
    SELECT
        FirstDateOfWeek,
        WeekNumber = row_number() OVER (PARTITION BY CalendarYear ORDER BY FirstDateOfWeek)
    FROM
        master.dbo.Calendar
    GROUP BY
        FirstDateOfWeek,
        CalendarYear
), Calendar AS
(
    SELECT
        WeekNumber =
        (
            SELECT
                WeekNumber
            FROM
                WeekNumbers WN
            WHERE
                C.FirstDateOfWeek = WN.FirstDateOfWeek
        ),
        *
    FROM
        master.dbo.Calendar C
    WHERE
        CalendarDate BETWEEN '1/1/2012' AND getutcdate()
)

SELECT
    C.FullName,
    --Cl.WeekNumber,
    --Cl.CalendarYear,
    --Cl.FirstDateOfWeek,
    --Cl.LastDateOfWeek,
    'Week: ' + CAST(Cl.WeekNumber AS VARCHAR(20)) +', Year: ' + CAST(Cl.CalendarYear AS VARCHAR(20)) WeekNumber,
    (
        SELECT
            count(*)
        FROM
            CRM.dbo.Incident I
            INNER JOIN CRM.dbo.StringMap SM ON
                I.StateCode = SM.AttributeValue
            INNER JOIN 
                (
                    SELECT
                        DISTINCT ME.Name,
                        ME.ObjectTypeCode
                    FROM
                        CRM.MetadataSchema.Entity ME
                ) E ON
                SM.ObjectTypeCode = E.ObjectTypeCode
        WHERE
            I.ModifiedOn >= Cl.FirstDateOfWeek 
            AND I.ModifiedOn < dateadd(day, 1, Cl.LastDateOfWeek)
            AND E.Name = 'incident'
            AND SM.AttributeName = 'statecode'
            AND SM.LangId = 1033
            AND I.CustomerId = C.ContactId
            AND SM.Value = 'Active'
    ) ActiveCases,
    (
        SELECT
            count(*)
        FROM
            CRM.dbo.Incident I
            INNER JOIN CRM.dbo.StringMap SM ON
                I.StateCode = SM.AttributeValue
            INNER JOIN 
                (
                    SELECT
                        DISTINCT ME.Name,
                        ME.ObjectTypeCode
                    FROM
                        CRM.MetadataSchema.Entity ME
                ) E ON
                SM.ObjectTypeCode = E.ObjectTypeCode
        WHERE
            I.ModifiedOn >= Cl.FirstDateOfWeek 
            AND I.ModifiedOn < dateadd(day, 1, Cl.LastDateOfWeek)
            AND E.Name = 'incident'
            AND SM.AttributeName = 'statecode'
            AND SM.LangId = 1033
            AND I.CustomerId = C.ContactId
            AND SM.Value = 'Resolved'
    ) ResolvedCases,
    (
        SELECT
            count(*)
        FROM
            CRM.dbo.Incident I
            INNER JOIN CRM.dbo.StringMap SM ON
                I.StateCode = SM.AttributeValue
            INNER JOIN 
                (
                    SELECT
                        DISTINCT ME.Name,
                        ME.ObjectTypeCode
                    FROM
                        CRM.MetadataSchema.Entity ME
                ) E ON
                SM.ObjectTypeCode = E.ObjectTypeCode
        WHERE
            I.ModifiedOn >= Cl.FirstDateOfWeek 
            AND I.ModifiedOn < dateadd(day, 1, Cl.LastDateOfWeek)
            AND E.Name = 'incident'
            AND SM.AttributeName = 'statecode'
            AND SM.LangId = 1033
            AND I.CustomerId = C.ContactId
            AND SM.Value = 'Canceled'
    ) CancelledCases
FROM
    CRM.dbo.Contact C
    CROSS JOIN
        (
            SELECT
                DISTINCT WeekNumber,
                CalendarYear,
                FirstDateOfWeek,
                LastDateOfWeek
            FROM
                Calendar
        ) Cl
ORDER BY
    C.FullName,
    Cl.WeekNumber
于 2012-11-08T04:30:58.833 に答える