-2

重複の可能性:
毎週、過去 6 週間の日曜日の日付を SQL でグループ化する方法は?

週数をカウントする必要があります。正常に動作しますが、[34]、[35]、[36]、[37]、[38]、[39] の週番号がわかりません。週番号はランタイムのみを認識します。たとえば、1 年には合計 52 週間が含まれます。@Bluefeet の助けを借りてこのクエリを取得しました。彼は同じスタックオーバーフローにクエリを投稿しました。間のフィールドで開始日と終了日を変更すると、機能しません。以下のクエリでweeknoをハードコーディングしたためです。年内のフィールド間の日付が何であれ、解決策を教えてください。

SET DATEFIRST 1 
SELECT case when InstanceType is not null then InstanceType else 'Sum' End InstanceType ,  
  sum([34]) AS FirstWeek, 
  sum([35]) AS SecondWeek, 
  sum([36]) AS ThirdWeek, 
  sum([37]) AS FourthWeek, 
  sum([38]) AS FifthWeek, 
  sum([39]) AS SixthWeek,  
  max(InstanceDescription) AS InstanceDescription 
FROM 
( 
  SELECT [SPGI01_INSTANCE_TYPE_C] AS InstanceType, 
    [34], [35], [36], [37], [38], [39], InstanceDescription  
  FROM 
  ( 
    SELECT I01.[SPGI01_INSTANCE_TYPE_C], 
      DatePart(wk, I01.[SPGI01_CREATE_S]) WeekNo, 
      DATEADD(DAY, 7 -DATEPART(WEEKDAY,I01.[SPGI01_CREATE_S]),  I01.[SPGI01_CREATE_S]) WeekEnd, 
      J03.SPGJ03_MSG_TRANSLN_X InstanceDescription  
    FROM [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY] I01  
    INNER JOIN [SUPER-G].[dbo].[CSPGI50_VALID_INSTANCE_TYPE] I50 
      ON I50.[SPGI50_INSTANCE_TYPE_C] = I01.[SPGI01_INSTANCE_TYPE_C]  
    LEFT JOIN CSPGJ02_MSG_OBJ J02 
      ON I50.SPGJ02_MSG_K = J02.SPGJ02_MSG_K  
    LEFT JOIN CSPGJ03_MSG_TRANSLN J03 
      ON J02.SPGJ02_MSG_K = J03.SPGJ02_MSG_K  
    where I50.[SPGA04_RATING_ELEMENT_D] = 1  
      and I01.[SPGI01_EXCEPTIONED_F] = 'N' 
      and I01.[SPGI01_DISPUTED_F] != 'Y'  
      AND J03.[SPGJ03_LOCALE_C] =  'en_US'  
      and I01.[SPGA02_BUSINESS_TYPE_C] = 'PROD'  
      and I01.[SPGA03_REGION_C] = 'EU'  
      and I01.[SPGI01_SUB_BUSINESS_TYPE_C] = 'PRD'  
      and I01.[SPGI01_CREATE_S] between '10-08-2012 00:00:00.000' AND '11-18-2012 23:59:59.000'  
  ) x 
  pivot 
  ( 
    count(WeekEnd) 
    FOR weekno IN ([34], [35], [36], [37], [38], [39])  
  ) p 
) x1 
GROUP BY  InstanceType WITH ROLLUP 
4

1 に答える 1

5

任意の日付値を渡して基準を満たすデータを取得できるようにする場合は、このタイプのPIVOT場合、次のような動的 SQL ソリューションを使用する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @colsRollup AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @StartDate DateTime,
    @EndDate DateTime

Set @StartDate = '10-08-2012 00:00:00.000'
Set @EndDate = '11-18-2012 23:59:59.000'

select @cols = STUFF((SELECT ',' + QUOTENAME(WeekEnd) 
                    from
                    (
                      select DatePart(wk, I01.[SPGI01_CREATE_S]) WeekEnd
                      from [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY]
                      where I01.[SPGI01_CREATE_S] between @StartDate AND @EndDate
                    ) src
                    group by WeekEnd
                    order by WeekEnd desc
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsRollup = STUFF((SELECT ', Sum(' + QUOTENAME(WeekEnd) +') as WeekNo'+Cast(Weekend as varchar(2))
                    from
                    (
                      select DatePart(wk, I01.[SPGI01_CREATE_S]) WeekEnd
                      from [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY]
                      where I01.[SPGI01_CREATE_S] between @StartDate AND @EndDate
                    ) src
                    group by WeekEnd
                    order by WeekEnd desc
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = '
             SELECT case when InstanceType is not null then InstanceType else ''Sum'' End InstanceType ,  
                '+@colsRollup+',  max(InstanceDescription) AS InstanceDescription
             FROM
             (
               SELECT SPGI01_INSTANCE_TYPE_C as InstanceType,
                    InstanceDescription, ' + @cols + ' 
               from 
               (
                  SELECT I01.[SPGI01_INSTANCE_TYPE_C], 
                    DatePart(wk, I01.[SPGI01_CREATE_S]) WeekNo, 
                    DATEADD(DAY, 7 -DATEPART(WEEKDAY,I01.[SPGI01_CREATE_S]),  I01.[SPGI01_CREATE_S]) WeekEnd, 
                    J03.SPGJ03_MSG_TRANSLN_X InstanceDescription  
                  FROM [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY] I01  
                  INNER JOIN [SUPER-G].[dbo].[CSPGI50_VALID_INSTANCE_TYPE] I50 
                    ON I50.[SPGI50_INSTANCE_TYPE_C] = I01.[SPGI01_INSTANCE_TYPE_C]  
                  LEFT JOIN CSPGJ02_MSG_OBJ J02 
                    ON I50.SPGJ02_MSG_K = J02.SPGJ02_MSG_K  
                  LEFT JOIN CSPGJ03_MSG_TRANSLN J03 
                    ON J02.SPGJ02_MSG_K = J03.SPGJ02_MSG_K  
                  where I50.[SPGA04_RATING_ELEMENT_D] = 1  
                    and I01.[SPGI01_EXCEPTIONED_F] = ''N'' 
                    and I01.[SPGI01_DISPUTED_F] != ''Y''  
                    AND J03.[SPGJ03_LOCALE_C] =  ''en_US''  
                    and I01.[SPGA02_BUSINESS_TYPE_C] = ''PROD'' 
                    and I01.[SPGA03_REGION_C] = ''EU''  
                    and I01.[SPGI01_SUB_BUSINESS_TYPE_C] = ''PRD''
                    and I01.[SPGI01_CREATE_S] between '+ convert(varchar(10), @StartDate, 120)+' AND '+ convert(varchar(10), @EndDate, 120)+'
              ) x
              pivot 
              (
                  count(WeekEnd)
                  for weekno in (' + @cols + ')
              ) p 
             ) x1
             GROUP BY InstanceType WITH ROLLUP '

execute(@query)

注:サンプルデータなどがないため、これはテストされていません。

于 2012-11-29T10:35:53.053 に答える