2009-09-21 18 views
17

मैं एसक्यूएल सर्वर में एक लॉग तालिका मिल गया है कि इस तरह दिखता है:एसक्यूएल समूह, गिनती के साथ

CREATE TABLE [dbo].[RefundProcessLog](
[LogId] [bigint] IDENTITY(1,1) NOT NULL, 
[LogDate] [datetime] NOT NULL, 
[LogType] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[RefundId] [int] NULL, 
[RefundTypeId] [smallint] NULL, 
[LogMessage] [varchar](1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[LoggedBy] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
CONSTRAINT [PK_RefundProcessLog] PRIMARY KEY CLUSTERED 
(
[LogId] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

क्या मैं चाहता हूँ प्रतिनिधित्व करता है कि कितने अलग अलग refundids प्रत्येक दिन प्रोसेस किया गया परिणामों की एक सूची है , किसी भी एनयूएलएल फेंकना।

इन परिणामों को उत्पन्न करने के लिए मुझे क्या एसक्यूएल लिखने की आवश्यकता होगी?

उत्तर

39

मैं में (एमएस एसक्यूएल) इस दृष्टिकोण की तरह दोहराया जा सकता:

SELECT 
    Convert(char(8), LogDate, 112), 
    count(distinct RefundId) 
FROM RefundProcessing 
GROUP BY Convert(char(8), LogDate, 112) 
0
Select count(*), LogDate, refundid from RefundProcessLog 
where refundid is not null 
group by LogDate, refundid 

संपादित करें:

या RefundID ड्रॉप आप इसे रिफंड

+0

यह काम नहीं करेगा। यह धनवापसी के प्रत्येक विशिष्ट मूल्य के लिए एक गिनती के साथ एक पंक्ति वापस करेगा, जो वांछित नहीं है। –

+0

संपादन को पढ़ें जिसे मैंने पहले ही उल्लेख किया था। – Gratzy

0

SqlServer में के आधार पर विभाजित नहीं करना चाहते हैं, यह होगा कुछ की तरह:

select datepart(YEAR, [LogDate]), datepart(MONTH, [LogDate]), datepart(DAY, [LogDate]), count(refundid) as [Count] 
from [RefundProcessing] 
group by datepart(YEAR, [LogDate]), datepart(MONTH, [LogDate]), datepart(DAY, [LogDate]) 
6

क्या डाटाबेस विक्रेता आप उपयोग कर रहे? जो भी यह है, "DateOnly (LogDate)" की जगह उचित construict के साथ निम्न में तारीख भाग निकालने logdate स्तंभ मान से (समय पट्टी) और फिर इस कोशिश करने के लिए:

Select [DateOnly(LogDate)], Count Distinct RefundId 
From RefundProcessLog 
Group By [DateOnly(LogDate)] 

Sql सर्वर में , उदाहरण के लिए, उचित निर्माण होगा:

Select DateAdd(day, 0, DateDiff(day, 0, LogDate)), Count(Distinct RefundId) 
From RefundProcessLog 
Group By DateAdd(day, 0, DateDiff(day, 0, LogDate)) 
1
SELECT COUNT(RefundId), DateOnly(LogDate) LoggingDate 
FROM RefundProcessLog 
GROUP BY DateOnly(LogDate) 

"DateOnly" अपने SQL डेटाबेस है, जो आप निर्दिष्ट नहीं किया है के लिए विशिष्ट है।

एसक्यूएल सर्वर के लिए आप "DateOnly"

+0

शायद आप परिणाम सेट में दिनांक शामिल करना चाहते हैं। जैसा लिखा है, यह धनवापसी की संख्या देगा, लेकिन यह जानने का कोई तरीका नहीं होगा कि किस दिन कौन सा नंबर होता है। –

+0

@ स्टेव: किया गया :) – pbz

16
select cast(LogDate as date) as LogDate, count(refundId) as refundCount 
from yourTable 
group by cast(LogDate as date) 

एसक्यूएल की बोली का उपयोग कर रहे पर निर्भर करता है के लिए इस्तेमाल कर सकते हैं DATEADD (दिन, 0, DateDiff (दिन, 0, LogDate)), आप हो सकता है सीएएसटी को किसी और चीज़ में बदलने के लिए। अभिव्यक्ति को लॉगडेट को केवल दिनांक-मूल्य में परिवर्तित करना चाहिए।

इसके अलावा, आप कहते हैं कि अगर "अलग refundId" क्योंकि वहाँ है कि आप केवल एक बार की गणना करना चाहते refundId के मूल्यों, उपयोग गणना (DISTINCT refundId)

+1

धन्यवाद आदमी, यह मेरे लिए सबसे अच्छा काम करता है –

+1

इसका प्रदर्शन स्वीकार किए गए समाधान से कहीं बेहतर होना चाहिए, जिसमें एक स्ट्रिंग रूपांतरण शामिल है। – James

संबंधित मुद्दे