0

次のように関数からデータを取得しています。

Date       |   Number
06-02-2012 |    2
06-05-2012 |    5
06-08-2012 |    5

DB で見つからないすべての日付を次の問題に含めたい場合は、どうすればよいですか?:

Date       |   Number
06-02-2012 |    2
06-03-2012 |    0
06-04-2012 |    0
06-05-2012 |    5
06-06-2012 |    0
06-07-2012 |    0
06-08-2012 |    5

SELECT convert(varchar, MIN(DATEADD(wk, DATEDIFF(wk, 0, person.date), 0)), 1), Count(person.ID) 
FROM [dbo].[Person] person
WHERE (DATEDIFF(D, person.date, @dateFrom) <=0 AND DATEDIFF(D, person.date, @dateTo) >=0) 
GROUP BY DATEPART(WK, person.date) 
4

3 に答える 3

2

選択した範囲内のすべての日付を含む一時テーブルまたはサブクエリを作成し、left joinソース データに対してa を使用します。

于 2012-09-10T08:48:51.893 に答える
0

短い間隔だけが必要な場合は、次のような関数を試すことができます。

DECLARE @minDate date
DECLARE @maxDate date

SET @minDate = '2012-09-01'
SELECT @maxDate = CAST( CONVERT( CHAR(8), GetDate(), 112) AS DATETIME)


DECLARE @Numbers TABLE(
  Date date,
  Number int)

WHILE @minDate < @maxDate
BEGIN
INSERT INTO @Numbers
SELECT @minDate, 0
WHERE NOT EXISTS( SELECT Number FROM Numbers WHERE [Date] = @minDate )

SET @minDate = DATEADD(day, 1, @minDate)

END

SELECT n.[Date], ISNULL(n.Number, 0) 
FROM @Numbers n
UNION ALL
SELECT Numbers.[Date], ISNULL(Numbers.Number, 0) 
FROM Numbers 
ORDER BY [Date]

さらに月と年が必要な場合は、必要な日付を事前に入力した永続的なヘルパー テーブルを作成するのが最善の方法だと思います。そして、他の回答に投稿されているように、簡単に参加してください。

于 2012-09-10T09:02:44.117 に答える
0

日付のテーブルを作成することをお勧めします。たとえば、2000 年 1 月 1 日から 2050 年 12 月 31 日までの日付を含む 1 列のテーブルです。次に、次のように LEFT JOIN クエリの左側でそのテーブルを使用できます。

SELECT date_table.date AS [Date], COUNT(your_table.primary_key) AS [Number]
FROM date_table
LEFT JOIN your_table ON date_table.date = your_table.date
WHERE date_table.date BETWEEN '2012-01-01' AND '2012-06-30'

日付テーブルを賢くインデックス化すると、非常に効率的なクエリになります。

于 2012-09-10T08:54:28.680 に答える