2009-04-30 12 views
20

मुझे निम्नलिखित आवश्यकता हैप्रत्येक दिनांक के लिए एसक्यूएल गणना

मेरे पास एक लॉगिंग टेबल है जो प्रत्येक दिन उत्पन्न होने वाली कुछ लीड लॉग करती है।

अब मुझे पिछले 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 

... और इतने पर

किसी को भी यह सबसे अच्छा संभव तरीके से कैसे करना है पता: अतः परिणाम सेट कुछ इस तरह देखना चाहिए? मेरा वर्तमान समाधान सी # में एक foreach के साथ पुनरावृत्ति कर रहा है, लेकिन मैं इसे एक एसपी में बजाय एसक्यूएल सर्वर पर हाथ करना पसंद करेंगे।

उत्तर

28

आप उपयोग कर सकते हैं:

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

मैं लेकिन CREATED_DATE इस का इस्तेमाल किया मैं इस छोटे से हैक लागू करने के लिए किया था एक पूर्ण datetime तो साथ एक क्षेत्र है: मैं सबसे अच्छा जवाब को बदलने के लिए इस प्रकार था DATEADD (दिन, 0, DateDiff (दिन, 0 , create_date)) समूह में भाग में और यह सब एक आकर्षण की तरह काम किया !! :) –

+1

गिनती (*) को गिनती (बनाया_डेट) भी बदलें। कॉलम के साथ गिनती केवल गैर-शून्य मानों की गणना करती है। यदि कॉलम शून्य है तो यह गिनती (*) से धीमा हो सकता है। – GilaMonster

+0

भले ही यह प्रश्न/उत्तर काफी पुराना है: बिना समय के दिनांक प्राप्त करने के लिए, आप कच्चे made_date के बजाय DATE (create_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

आपका जहां खंड यहां आपको सबसे पुराना दिन –

+1

पर आंशिक रूप से आंशिक दिनों का मूल्य देगा, यह मेरे लिए बहुत अच्छा काम करता है (जहां खंड है) धन्यवाद! – tree

2

यह पूर्णांक द्वारा आपके एकत्रीकरण को करने के लिए सबसे अधिक कुशल है और फिर प्रस्तुति के लिए डेटाटाइम पर वापस परिवर्तित करें।

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 काम नहीं करता है और साथ ही ** वर्कर **। int अक्सर – tree

+0

समूह की तारीखों को समूहित करेगा, मैंने int रूपांतरण के साथ भी समस्याएं देखी हैं। मेरे पास 2013/12/21 को 6 रिकॉर्ड थे और int संस्करण ने 1 की गिनती वापस कर दी। वर्कर संस्करण 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 

बस इस तरह से इस संहिता रख दिया और

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

धन्यवाद Suvabrata Roy ICRA Online Ltd. Kolkata

2

सपा फोन जब आप पर किसी पूर्णांक पर दिनांक समय डाली यह "ट्रंकेटस" दोपहर, आप

जैसे दिन को पट्टी करना चाहते हैं

कास्ट (DATEADD (DAY, DATEDIFF (DAY, 0, create_date), 0) int के रूप में) डेबकेट

1

मेरे समान प्रश्न थे हालांकि मेरा कॉलम कनवर्ट (दिनांक, mydatetime) शामिल था।

Select 
    count(created_date) as counted_leads, 
    Convert(date,created_date) as count_date 
from table 
group by Convert(date,created_date) 
संबंधित मुद्दे