2009-04-30 17 views
20

Mam następującą potrzebę:Liczba obliczeń SQL dla każdej daty

Posiadam tabelę rejestrowania, która rejestruje wygenerowane przez siebie wyniki każdego dnia.

Teraz muszę pobrać raport dotyczący liczby potencjalnych klientów każdego dnia w ciągu ostatnich 10 dni.

Powiedzmy tabela wygląda następująco:

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

I muszę policzyć liczbę potencjalnych klientów dla każdego dnia, 10 dni łączna. więc zestaw wynik powinien wyglądać mniej więcej tak:

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

... i tak dalej

ktoś wie jak to zrobić w najlepszy możliwy sposób? Moje obecne rozwiązanie polega na iteracji z foreach w języku C#, ale bardzo chciałbym przekazać go na serwerze sql zamiast w sp.

Odpowiedz

28

Można użyć:

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

Kiedyś to jednak w CREATED_DATE jest pole z pełnym datetime więc musiałem zastosować tę małą Hack: DATEADD (dd, 0, DateDiff (dd, 0 , created_date)) w grupie po części i wszystko działało jak czar !! :) –

+1

Zmień także liczbę (created_date) na Count (*). Licznik z kolumną liczy tylko wartości inne niż null. Jako taki może być wolniejszy niż liczba (*), jeśli kolumna jest zerowa. – GilaMonster

+0

Nawet jeśli to pytanie/odpowiedź jest dość stara: aby uzyskać datę bez czasu, można użyć DATE (created_date) zamiast raw created_date - więc wyniki będą pogrupowane według daty bez czasu! – baris1892

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

Twój CREATED_DATE pole jest datetime, więc trzeba zdejmować czas przed ugrupowanie będzie działać, jeśli chcesz przejść przez data:

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

Twój klauzula gdzie tutaj potencjalnie da ci częściową liczbę dni liczenia na najstarszy dzień –

+1

to działało świetnie dla mnie (bez klauzuli gdzie) dzięki! – tree

2

Najbardziej efektywne jest wykonywanie agregacji według liczby całkowitej, a następnie konwersja z powrotem do daty i godziny w celu prezentacji.

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 nie działa tak dobrze jak ** varchar **. int często grupuje daty razem – tree

+0

Widziałem również problemy z konwersją int. W dniu 2013/12/21 miałem 6 rekordów, a wersja int zwróciła liczbę 1. Wersja Varchar zwróciła liczbę 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 

Wystarczy umieścić ten kod i zadzwonić do SP w ten sposób

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

Dzięki Suvabrata Roy ICRA Online Ltd. Kolkata

2

Kiedy rzucisz DateTime do int it "obcina" przy w południe, możesz rozebrać dzień tak, jak to

cast (DATEADD (DZIEŃ, DATEDIFF (DZIEŃ, 0, created_date), 0) jako int) jako DayBucket

1

Miałem podobne pytanie, jednak moje dotyczyło kolumny Konwertuj (date, mydatetime). Musiałem zmienić najlepszą odpowiedź następująco:

Select 
    count(created_date) as counted_leads, 
    Convert(date,created_date) as count_date 
from table 
group by Convert(date,created_date) 
Powiązane problemy