1

私はSQLServer2008で作業しています。週単位でデータを集約するストアドプロシージャを作成しています。

集計のコードは

ALTER PROCEDURE [dbo].[ups_URLBatchStats] 
   (@startDate datetime, @endDate datetime,@source varchar(8))
AS BEGIN
    SELECT 
       DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6) AS [Week Commencing], 
       SUM(Unresolved) AS Unresolved,
       SUM(Resolved) AS Resolved,
       SUM(TurkSpend) AS TurkSpend
    FROM 
       dbo.V_URLBatchStats 
    WHERE
       ScheduleDate BETWEEN @startDate AND @endDate 
       AND Source = ISNULL(@source, Source)
    GROUP BY
       DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6)
    ORDER BY 
       DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6)
END

表示すると正しい結果が得られますが、どの週のデータもない場合は、列に「0」の値を指定して表示する必要があります。

では、これらのスキップされた毎週の行をどのように処理できますか?

前もって感謝します。

4

2 に答える 2

1

行番号が生成されたsysobjectsを使用して週の列を作成できRIGHT JOINます。

SELECT o.Num AS [Week Commencing], SUM(Unresolved) AS Unresolved,sum(Resolved)as Resolved,sum(TurkSpend) as TurkSpend 
FROM dbo.V_URLBatchStats s
RIGHT JOIN (SELECT ROW_NUMBER() OVER (ORDER BY object_id) as [Num] FROM sysobjects) o 
    on DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6) = o.Num
WHERE ScheduleDate between @startDate and @endDate 
AND Source=ISNULL(@source,Source)
GROUP BY DATEADD(wk, DATEDIFF(wk, 0, ScheduleDate), 6), o.Num
ORDER BY 1

これはメモリから書き込まれ、テストされていないことに注意してください。ただし、原則は機能するはずです。

于 2012-10-12T07:37:09.027 に答える
1

あなたは現在間違った週を選択しているようです、私はこれを修正しようとしました:

SELECT dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6)) AS [Week Commencing], 
coalesce(SUM(Unresolved), 0) AS Unresolved,
coalesce(sum(Resolved), 0)as Resolved,
coalesce(sum(TurkSpend), 0) as TurkSpend
FROM dbo.V_URLBatchStats 
right join
master..spt_values 
on ScheduleDate between @startDate and @endDate and Source=ISNULL(@source,Source)
where type = 'P' and dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6)) <= @enddate
GROUP BY dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6))
ORDER BY dateadd(wk, number, DATEADD(wk, DATEDIFF(wk, 0, @startdate)-1, 6))
于 2012-10-12T08:56:31.267 に答える