Sql समूह द्वारा दिन के लिए क्वेरी


134

मैं सभी बिक्री को सूचीबद्ध करना चाहता हूं, और दिन के हिसाब से राशि जमा करता हूं।

Sales (saleID INT, amount INT, created DATETIME)

अद्यतन मैं SQL Server 2005 का उपयोग कर रहा हूँ


4
आपको यह निर्दिष्ट करना होगा कि आप किस डेटाबेस का उपयोग कर रहे हैं, क्योंकि उनकी SQL बोलियों में दिनांक फ़ंक्शन भिन्न हैं।
गुफ्फा

दिन पर समूह बनाने के बारे में अधिक जानकारी के लिए यहां देखें। sqlserverlearner.com/2012/group-by-day-with-examples

जवाबों:


164

यदि आप SQL सर्वर का उपयोग कर रहे हैं,

dateadd(DAY,0, datediff(day,0, created)) बनाया गया दिन वापस आएगा

उदाहरण के लिए, यदि बिक्री '2009-11-02 06: 12: 55.000' पर बनाई गई है, तो dateadd(DAY,0, datediff(day,0, created))'2009-11-02 00: 00: 00: 00) वापस करें।

select sum(amount) as total, dateadd(DAY,0, datediff(day,0, created)) as created
from sales
group by dateadd(DAY,0, datediff(day,0, created))

अपने सिर के ऊपर से, इस तरह से डिजाइन करना या सीधे उस पर DATE और समूह का उपयोग करना अधिक सरल होगा?
सिनास्टेटिक

@Sinaesthetic जो आवश्यकताओं पर निर्भर करता है।
अनवर चंद्र

108

SQL सर्वर के लिए:

GROUP BY datepart(year,datefield), 
    datepart(month,datefield), 
    datepart(day,datefield)

या तेज (क्यू 8-कोडर से):

GROUP BY dateadd(DAY,0, datediff(day,0, created))

MySQL के लिए:

GROUP BY year(datefield), month(datefield), day(datefield)

या बेहतर (जॉन ब्राइट से):

GROUP BY date(datefield)

Oracle के लिए:

GROUP BY to_char(datefield, 'yyyy-mm-dd')

या तेजी से (IronGoofy से):

GROUP BY trunc(created);

Informix के लिए (जोनाथन लेफ़लर द्वारा):

GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)

सभी अलग-अलग वाक्यविन्यासों को सूचीबद्ध करने के लिए धन्यवाद
CTS_AE

43

यदि आप MySQL का उपयोग कर रहे हैं:

SELECT
    DATE(created) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    saledate

यदि आप MS SQL 2008 का उपयोग कर रहे हैं:

SELECT
    CAST(created AS date) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    CAST(created AS date)

5
मुझे डर है कि ये उदाहरण microsecond
Andomar

एंडोमर, मैंने सिर्फ एमएस एसक्यूएल एक (सिंटैक्स के लिए एक मामूली ट्वीक के बाद) की कोशिश की। यह खुशी से यहां तारीख तक समूह बनाता है। मेरे पास MySQL के लिए भी जाने और कोशिश करने का समय नहीं है, लेकिन मैं अपने पूरे दिन के काम में इसका उपयोग करता हूं और मैं कम या ज्यादा निश्चित हूं कि यह तारीख तक भी समूह में जा रहा है।
जॉन ब्राइट

@Jon Bright: मेरी टिप्पणी एक संपादन से पहले थी। वर्तमान एक अभी भी गलत है: दिनांक प्रकार केवल SQL Server 2008 में समर्थित है
एंडोमर

एंडोमर, चूंकि आपने मुझे अनिश्चित बना दिया है, मैंने अभी-अभी MySQL एक को भी चेक किया है। यह पूरी तरह से काम करता है और आज तक समूह है।
जॉन ब्राइट

एंडोमर, संपादन ने परिणाम को शून्य कार्यात्मक अंतर दिया, कम से कम तारीखों या माइक्रोसेकंड द्वारा समूहीकृत होने वाली चिंताओं के रूप में। यदि केवल 2008 दिनांक समय (मैंने देखा नहीं है) का समर्थन करता है, तो इसका उत्तर गलत नहीं है, यह केवल MS SQL 2008 पर लागू होता है। एक अंतर है।
जॉन ब्राइट

7

वास्तव में यह इस बात पर निर्भर करता है कि आप किस DBMS का उपयोग कर रहे हैं, लेकिन नियमित SQL convert(varchar,DateColumn,101)में DATETIME प्रारूप को तिथि (एक दिन) में बदल देगा

इसलिए:

SELECT 
    sum(amount) 
FROM 
    sales 
GROUP BY 
    convert(varchar,created,101)

Magix नंबर 101वह दिनांक स्वरूप है जिसे इसे में कनवर्ट किया जाता है


2
+1 हाँ यह करता है, जो 101 का मतलब यहाँ समझाया गया है msdn.microsoft.com/en-us/library/ms187928.aspx
एंडोमर

7

यदि आप SQL सर्वर का उपयोग कर रहे हैं, तो आप अपनी तालिका में तीन परिकलित फ़ील्ड जोड़ सकते हैं:

Sales (saleID INT, amount INT, created DATETIME)

ALTER TABLE dbo.Sales
  ADD SaleYear AS YEAR(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleMonth AS MONTH(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleDay AS DAY(Created) PERSISTED

और अब आप आसानी से दिन, महीने या बिक्री के वर्ष के आधार पर ऑर्डर कर सकते हैं:

SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay

उन गणना किए गए फ़ील्ड को हमेशा अद्यतित रखा जाएगा (जब आपकी "निर्मित" तिथि में परिवर्तन होता है), वे आपकी तालिका का हिस्सा होते हैं, उन्हें नियमित फ़ील्ड की तरह उपयोग किया जा सकता है, और यहां तक ​​कि अनुक्रमित भी किया जा सकता है (यदि वे "निजीकृत" हैं ) - महान सुविधा जो पूरी तरह से अप्रयुक्त है, IMHO।

न घुलनेवाली तलछट


हाँ सचमुच! यदि आपको दिन, महीने, वर्ष में हर समय रिपोर्टिंग करने की आवश्यकता हो तो बहुत उपयोगी है :-)
marc_s

2

Oracle के लिए आप कर सकते हैं

group by trunc(created);

चूंकि यह पिछली आधी रात को बनाए गए डेटाइम को काट देता है।

एक और विकल्प है

group by to_char(created, 'DD.MM.YYYY');

जो एक ही परिणाम प्राप्त करता है, लेकिन यह एक प्रकार के रूपांतरण की आवश्यकता के रूप में धीमा हो सकता है।


यह शायद काफी ओरेकल-विशिष्ट है, लेकिन काफी आसान है। जल्दी से महीने के पहले दिन आदि देने के लिए एक ट्रंक ((, 'MONTH') भी है
थोरस्टन

2

PostgreSQL के लिए:

GROUP BY to_char(timestampfield, 'yyyy-mm-dd')

या कास्ट का उपयोग कर:

GROUP BY timestampfield::date

यदि आप गति चाहते हैं, तो दूसरे विकल्प का उपयोग करें और एक सूचकांक जोड़ें:

CREATE INDEX tablename_timestampfield_date_idx ON  tablename(date(timestampfield));

-3

linq का उपयोग करें

from c in Customers
group c by DbFunctions.TruncateTime(c.CreateTime) into date
orderby date.Key descending
select new  
{
    Value = date.Count().ToString(),
    Name = date.Key.ToString().Substring(0, 10)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.