2009-04-30 14 views
20

Ich habe folgenden BedarfSQL Count für jedes Datum

Ich habe eine Logging-Tabelle, die som Leads generiert jeden Tag protokolliert.

Jetzt muss ich einen Bericht über die Anzahl der Leads für jeden Tag in den letzten 10 Tagen ziehen.

Nehmen wir die Tabelle wie folgt aussieht:

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

Und ich brauche die Anzahl der Leads für jeden Tag zu zählen, 10 Tage insgesamt. SO die Ergebnismenge soll wie folgt aussehen:

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

... und so weiter

Wer weiß, wie dies die beste Art und Weise zu tun? Meine aktuelle Lösung ist mit einer Foreach in C# iterieren, aber ich würde es sehr gerne auf dem SQL-Server statt in einer sp übergeben.

Antwort

28

können Sie verwenden:

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

ich verwendet, um dieses aber das created_date ein Feld mit einer vollständigen Datetime ist so hatte ich dieses kleine Hack anwenden: DATEADD (dd, 0, DATEDIFF (dd, 0 , created_date)) in der Gruppe nach Teil und es hat alles wie ein Charme gearbeitet !! :) –

+1

Ändern Sie auch die Anzahl (created_date) in Count (*). Count mit einer Spalte zählt nur die Nicht-Null-Werte. Als solche kann es langsamer als count (*) sein, wenn die Spalte Nullable ist. – GilaMonster

+0

Auch wenn diese Frage/Antwort ziemlich alt ist: Um das Datum ohne Zeitangabe zu erhalten, können Sie DATE (created_date) anstelle von raw created_date verwenden - so werden die Ergebnisse nach Datum ohne Zeit gruppiert! – baris1892

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

Ihr created_date Feld ist datetime, so dass Sie die Zeit abzustreifen brauchen werden, bevor die Gruppierung wird funktionieren, wenn Sie nach dem Datum gehen wollen:

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

Ihre Where-Klausel hier wird Ihnen möglicherweise einen Teil Tage im Wert von zählt am ältesten Tag –

+1

das hat gut funktioniert für mich (minus der Where-Klausel) danke! – tree

2

Am effizientesten ist es, die Aggregation über Integer durchzuführen und dann für die Präsentation zurück in datetime zu konvertieren.

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 funktioniert nicht so gut wie ** varchar **. int wird oft Daten zusammen gruppieren – tree

+0

Ich sah Probleme mit der Int-Konvertierung auch. Ich hatte 6 Datensätze am 2013/12/21 und die int-Version gab eine Zählung von 1 zurück. Varchar-Version gab eine Anzahl von 6 zurück. – 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 

einfach diesen Code setzen und rufen Sie die SP auf diese Weise

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

Dank Suvabrata Roy ICRA Online Ltd. Kolkata

2

Wenn Sie einen Datetime in einen int warf sie "Verkürzungen" an Mittag, möchten Sie vielleicht den Tag so ausziehen

Besetzung (DATEADD (DAY, DATEDIFF (TAG, 0, created_date), 0) als int) wie DayBucket

1

Ich hatte ähnliche Frage, aber meine beteiligt eine Spalte Convert (Datum, Mydatetime). Ich hatte die beste Antwort zu ändern, wie folgt:

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