2009-04-30 10 views
20

私は以下の必要性を持っています。各日付のSQLカウント

私は毎日somリードを記録するログテーブルを持っています。

ここ10日間、毎日のリード数を報告する必要があります。

tbl_leads 
id int, 
first_name nvarchar(100), 
last_name nvarchar(100), 
created_date datetime 

そして、私は10日、総、日ごとにリードの数をカウントする必要があります。

表は次のようになりますと言うことができます。

counted_leads | count_date 
5    | 2009-04-30 
7    | 2009-04-29 
5    | 2009-04-28 
7    | 2009-04-27 

...とそう

上の誰もが、この最良の方法を行う方法を知っている: はSO結果セットは次のようになりますか? 私の現在のソリューションはC#でforeachを使って繰り返していますが、spの代わりにSQL Serverに渡したいと思っています。

答えて

28

あなたは使用することができます。

Select 
    count(created_date) as counted_leads, 
    created_date as count_date 
from 
    table 
group by 
    created_date 
+4

私はこれを使用しますがcreated_dateがいっぱい日時を持つフィールドであるので、私はこの小さなハックを適用する必要がありました: DATEADD(DD、0、DATEDIFF(DD、0 、created_date)) グループでは、すべてのチャームのように働いていました! :) –

+1

また、カウント(created_date)をCount(*)に変更します。列でカウントすると、NULL以外の値のみがカウントされます。したがって、カラムがNULL可能である場合、count(*)よりも遅くなる可能性があります。 – GilaMonster

+0

この質問/回答がかなり古くても、時間のない日付を取得するには、未加工のcreated_dateの代わりにDATE(created_date)を使用できます。結果は時間のない日付でグループ化されます。 – baris1892

1
Select count(created_date) total 
    , created_dt 
    from table 
group by created_date 
order by created_date desc 
5

をごcreated_dateフィールドがdatetimeですので、あなたが期日までに行きたい場合は、グループ化が動作するまでの時間を取り除く必要があります:

SELECT COUNT(created_date), created_date 
FROM table 
WHERE DATEDIFF(created_date, getdate()) < 10 
GROUP BY convert(varchar, created_date, 101) 
+0

あなたのwhere句は、潜在的にあなたに最も古い日のカウントの一部の日数を与えるでしょう –

+1

これは私のために(マイナス部分句)ありがとう!ありがとう! – tree

2

集計を整数で行い、その後、表示のためにdatetimeに変換するのが最も効率的です。

select 
    cast(daybucket - 1 as datetime) as count_date, 
    counted_leads 
from 
    (select 
     cast(created_date as int) as DayBucket, 
     count(*) as counted_leads 
    from mytable 
    group by cast(created_date as int)) as countByDay 
+0

intは** varchar **と同様に動作しません。 intはしばしば日付をまとめます。 – tree

+0

int変換にも問題がありました。 2013/12/21に6つのレコードがあり、intバージョンは1のカウントを返しました。Varcharバージョンは6のカウントを返しました。 – slolife

1
CREATE PROCEDURE [dbo].[sp_Myforeach_Date] 
    -- Add the parameters for the stored procedure here 
    @SatrtDate as DateTime, 
    @EndDate as dateTime, 
    @DatePart as varchar(2), 
    @OutPutFormat as int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    Declare @DateList Table 
    (Date varchar(50)) 

    WHILE @SatrtDate<= @EndDate 
    BEGIN 
    INSERT @DateList (Date) values(Convert(varchar,@SatrtDate,@OutPutFormat)) 
    IF Upper(@DatePart)='DD' 
    SET @SatrtDate= DateAdd(dd,1,@SatrtDate) 
    IF Upper(@DatePart)='MM' 
    SET @SatrtDate= DateAdd(mm,1,@SatrtDate) 
    IF Upper(@DatePart)='YY' 
    SET @SatrtDate= DateAdd(yy,1,@SatrtDate) 
    END 
    SELECT * FROM @DateList 
END 

ただ、このコードを入れて、あなたはそれint型 "切り捨て" での日時を唱えたとき、このように

exec sp_Myforeach_Date @SatrtDate='03 Jan 2010',@EndDate='03 Mar 2010',@DatePart='dd',@OutPutFormat=106 

おかげ Suvabrata Roy ICRA Online Ltd. Kolkata

2

をSPを呼び出します正午、あなたはそのように一日を取り除きたいかもしれません

キャスト(DATEADD(DAY、DATEDIFF(DAY、0、created_date)、0)をDayBucketとして

1

私の場合はConvert(date、mydatetime)という列がありました。私は次のように最良の答えを変更する必要がありました:

Select 
    count(created_date) as counted_leads, 
    Convert(date,created_date) as count_date 
from table 
group by Convert(date,created_date)