-1

たとえば2012年8月25日から2012年1月9日までのSQLのレコードを検索し、日付でグループ化したい

これが私の質問です

SELECT CONVERT(VARCHAR(10), date, 105) AS dt,
COUNT(id) AS cnt
FROM tablename
WHERE date BETWEEN CONVERT(DATETIME, '21-08-2012 00:00:00:000',103)
AND CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103)
GROUP BY CONVERT(VARCHAR(10), date, 105)

私は次のように結果を得ています

dt                 cnt
01-09-2012         48
27-08-2012         1
28-08-2012         3
29-08-2012         11
30-08-2012         3

しかし、それを期待してください

dt                 cnt
25-08-2012          0
26-08-2012          0
01-09-2012          48
27-08-2012          1
28-08-2012          3
29-08-2012         11
30-08-2012          3

上記のクエリを変更する方法私もCASEで試しましたが、運がありません

どうもありがとう..

4

3 に答える 3

3

結果でこれらの日付が欠落している理由は、テーブルにそれらのデータがないためですが、次のようにすると、指定された範囲内のすべての日付が確実に取得されます。

CREATE TABLE #tmp_dates ([date] datetime)  

DECLARE @dt_start datetime, @dt_end datetime, @dt_dif int  

SET @dt_start = CONVERT(DATETIME, '21-08-2012 00:00:00:000',103) 
SET @dt_end = CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103)  
SET @dt_dif = datediff(day,@dt_start,@dt_end)  

WHILE @dt_dif >= 0 BEGIN 
INSERT INTO #tmp_dates 
SELECT dateadd(day,@dt_dif,@dt_start) 
SET @dt_dif = @dt_dif - 1 
END  

SELECT CONVERT(VARCHAR(10), t2.[date], 101) AS dt,  COUNT(t1.id) AS cnt 
INTO #tmp_result 
FROM tablename t1  
RIGHT OUTER JOIN #tmp_dates t2  
ON CONVERT(VARCHAR(10), t1.[date], 101) = CONVERT(VARCHAR(10), t2.[date], 101) 
GROUP BY CONVERT(VARCHAR(10), t2.[date], 101)   
ORDER BY CONVERT(DATETIME,CONVERT(VARCHAR(10), t2.[date], 101)) ASC /* DESC */

SELECT convert(VARCHAR(10),CONVERT(DATETIME,dt),105) as dt,cnt FROM #tmp_result

DROP TABLE #tmp_dates 
DROP TABLE #tmp_result
于 2012-09-04T16:15:00.617 に答える
2

必要なデータを返すようにクエリを直接変更することはできません。問題の日付をカウントするには、実際にそれらの日付を持つレコードがターゲット テーブルに存在する必要があります。ただし、あなたの場合、日付はクエリの単なるパラメーターです。結果として、それらを結果セットに組み込む方法はありません。

データが必要なすべての日付を含むセカンダリ テーブルを作成し、クエリをその日付テーブルからターゲット テーブルへの左外部結合として再特徴付けする必要があります。これにより、「日付」テーブルには存在するがターゲット テーブルには存在しない日付のゼロ カウントが得られます。

于 2012-09-04T15:59:03.740 に答える
0

を使用してはIsNull()どうですか?これがうまくいくかどうか教えてください。

SELECT CONVERT(VARCHAR(10), date, 105) AS dt,
ISNULL(COUNT(id),0) AS cnt
FROM tablename
WHERE date BETWEEN CONVERT(DATETIME, '21-08-2012 00:00:00:000',103)
AND CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103)
GROUP BY CONVERT(VARCHAR(10), date, 105)
于 2012-09-04T16:04:20.133 に答える