1

このような単純なカウントクエリがあります

SELECT BILLDATE,COUNT(BILLDATE) AS CNT 
FROM BILLS 
WHERE BILLDATE >='08/01/2013' AND    BILLDATE<='09/09/2013'  GROUP BY BILLDATE

表示されるはずです

billdate    cnt
01/09/2013   10
02/09/2013    0
03/09/2013    3

しかし、私は得ています

billdate    cnt
01/09/2013   10
03/09/2013    3

クエリの書き方は?

4

1 に答える 1

3

BILLSこれは、 for にレコードがないためですBILLDATE = '2013-09-02'(これWHERE BILLDATE >='08/01/2013' AND BILLDATE<='09/09/2013'はタイプミスであり、書きたかったのだと思います)。WHERE BILLDATE >='01/09/2013' AND BILLDATE<='03/09/2013'

クエリを作成する DB 固有の方法は多数ありますが、このタイプのクエリを頻繁に実行する必要がある場合は、静的テーブルを作成し、日付を入力するのが最善の方法だと思いますDATES( from 、たとえば1900-01-01until 3000-01-01):

Date
1900-01-01
1900-01-02
1900-01-03
...
2010-01-01
...

次のように使用します。

select
    d.DATE,
    count(b.BILLDATE) as cnt
from DATES as d
    left outer join BILLS as b on b.BILLDATE = d.DATE
where d.DATE >='2013-09-01' and d.DATE <= '2013-09-03'
group by d.DATE

日付のISO 8601形式にも注意してください。

パフォーマンスをあまり気にしない場合は、再帰的な共通テーブル式を使用できます。

with cte([Date]) as (
    select convert(date, '20130901', 112) -- Start date
    union all
    select dateadd(dd, 1, [Date])
    from cte
    where [Date] < '20130903'             -- End date
)
select
    c.[Date],
    count(b.BILLDATE) as cnt
from cte as c
    left outer join BILLS as b on b.BILLDATE = d.DATE
于 2013-09-13T11:20:21.563 に答える