コメントで指定された SQL Fiddle を変更しました。これにより、1 日の合計が既にある場合に、目的の出力が得られます。
http://www.sqlfiddle.com/#!6/09168/2>
DECLARE @startDate datetime DECLARE @endDate datetime SELECT @startDate = '2012-10-08' SELECT @endDate = '2012-10-12' SELECT DT1.ddate, DT1.phone, DT1.letter, DT1.email, DT1.web, SUM(DT2.phone) phoneTotal, SUM(DT2.letter) letterTotal, SUM(DT2.email) emailTotal, SUM(DT2.web) webTotal FROM DailyTotals DT1 LEFT JOIN DailyTotals DT2 ON DT1.ddate >= DT2.ddate AND DT2.ddate >= @startDate WHERE DT1.ddate <= @endDate GROUP BY DT1.ddate, DT1.phone, DT1.letter, DT1.email, DT1.web
プレ>1 つのステートメントにしたい場合は、DailyTotals を、毎日の合計を取得するサブクエリに置き換える必要があります。ただし、DailyTotals というビューを作成して使用することをお勧めします。
編集:
一時テーブルの代わりに CTE を使用して日付範囲を生成できます。 @temp の代わりに CTE と結合するように機能するという完全なクエリを修正しました。私はそれをテストする方法がありません。これが機能しない場合は、スキーマで SLQ Fiddle を作成してください。もう一度試します。
WITH Dates AS ( SELECT CONVERT(date, MIN(ComplaintTime)) AS ddate, MAX(ComplaintTime) as EndDate FROM Complaints UNION ALL SELECT DATEADD(DAY, 1, ddate), EndDate FROM Dates WHERE DATEADD(DAY, 1, ddate) <= EndDate ) SELECT * FROM (select ddate,ISNULL(L,0) AS Letter, ISNULL(P,0) AS Phone, ISNULL(E,0) AS Email, ISNULL(W,0) AS WEB FROM ( select ComplaintMedia_Abbri, ddate,COUNT(ComplaintMedia) as c from Complaint INNER JOIN Dates ON convert(date,ComplaintDate)=ddate OPTION (MAXRECURSION 500) WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1 group by ComplaintMedia_Abbri,ddate ) p pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt ) AS [A] INNER JOIN ( select ddate,ISNULL(L,0) AS LetterTot, ISNULL(P,0) AS PhoneTot, ISNULL(E,0) AS EmailTot, ISNULL(W,0) AS WEBTot FROM ( select ComplaintMedia_Abbri,ddate, COUNT(ComplaintMedia_Abbri) as c from Complaint INNER JOIN Dates OPTION (MAXRECURSION 0) ON CONVERT(date,ComplaintDate) <= ddate OPTION (MAXRECURSION 0) WHERE isnull(Receivedby_Dept,Relatesto_Dept)=1 group by ComplaintMedia_Abbri,ddate ) p pivot (SUM(c) FOR ComplaintMedia_Abbri IN (E,W,L,P)) AS pvt ) AS [B] ON A.ddate=B.ddate order by A.ddate
プレ>