1

SQL (2012) データベースでクエリを実行しています。これは、特定の日付範囲内のレコード数を日付でグループ化して返します。

例えば:

Date    Count
12/08   12
14/08   19
19/08   11

欠損値があるためにプロットしたグラフが台無しになるので、空白を埋める必要があります。結果が得られない場合に、SQL に空白行または「0」値を強制的に報告させる方法はありますか?

私のクエリは

SELECT TheDate, count(recordID) 
FROM myTable 
WHERE (TheDate between '12-AUG-2013 00:00:00' and '20-AUG-2013 23:59:59')
GROUP BY TheDate

レコードを含む一時テーブルを作成し、そこから選択して、myTable のレコードを正しく結合する必要がありますか?

助けてくれてありがとう!

4

2 に答える 2

2

日付範囲の (一時的または永続的な) テーブルleft joinを作成すると、結果に対して空白を含む結果セットを作成できます。

 SELECT dates.TheDate, count(recordID) 
 FROM 
 ( select 
      convert(date,dateadd(d,number,'2013-08-12')) as theDate 
   from master..spt_values 
   where type='p' and number < 9
 ) dates
 left join yourtable on dates.thedate = convert(date,yourtable.thedate)
 GROUP BY dates.TheDate 
于 2013-10-16T14:38:14.237 に答える
0

一時テーブルでも問題はありませんが、このような短い日付範囲の場合は、さらに単純化してUNION-ed サブクエリを使用できます。例えば:

SELECT dates.TheDate, ISNULL(counts.Records, 0)
FROM
(SELECT TheDate, count(recordID) AS Records
 FROM myTable 
 WHERE (TheDate between '12-AUG-2013 00:00:00' and '20-AUG-2013 23:59:59')
 GROUP BY TheDate
) counts
RIGHT JOIN
(SELECT CAST('12-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('13-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('14-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('15-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('16-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('17-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('18-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('19-AUG-2013' AS DATETIME) AS TheDate
 UNION ALL SELECT CAST('20-AUG-2013' AS DATETIME) AS TheDate
) dates
ON counts.TheDate = dates.TheDate

これがSQL Fiddle Demoです。

より一般的な (しかしより複雑な) ソリューションが必要な場合は、同様の質問に対するこの優れた回答(@RedFilter による) をご覧ください。

于 2013-10-16T14:36:32.260 に答える