2011-01-26 13 views
11

मेरे पास निम्न कोड है, जो कुछ घटनाओं (YYYY-MM-DD HH: MM: SS) को सप्ताहों में समूहित करता है जो उदाहरण के लिए प्रदर्शित होते हैं "वाई: 2010 - सप्ताह: 50"।सप्ताह के आधार पर समूह, खाली सप्ताह कैसे प्राप्त करें?

SELECT DATE_FORMAT(date, 'Y:%X - Week:%V') AS regweek, COUNT(*) as number 

यह अच्छा काम करता है, लेकिन मैं सभी सप्ताह वापस जाने के लिए, भले ही लोगों को है, जिसमें किसी भी स्थिति रखा गया है चाहते हैं।

कोई घटना तीसरे सप्ताह में पंजीकृत है, तो पल में, मैं:

week 1: 10 
week 2: 1 
week 4: 2 

मैं प्राप्त करना चाहते हैं:

week 1: 10 
week 2: 1 
week 3: 0 
week 4: 2 
+0

आप * सभी * सप्ताह कब से चाहते हैं? समय की शुरुआत? – thkala

+1

पहली घटना कब हुई थी या शायद पिछले एन महीने भी ठीक रहेगा। यह टिप के लिए धन्यवाद – Danilo

उत्तर

8

एसक्यूएल पंक्तियों में मौजूद नहीं है वापस नहीं लौट सकते कुछ टेबल जिस प्रभाव को आप चाहते हैं उसे प्राप्त करने के लिए, आपको वर्ष के संभावित सप्ताह में एक पंक्ति के साथ एक टेबल वीक (वीकएनओ आईएनटी) की आवश्यकता होगी (जो, आईआईआरसी, या तो 53 या 54 संभव सप्ताह है, इस पर निर्भर करता है कि आप कैसे गिनते हैं)।

फिर, एक बाहरी के साथ अपने नियमित रूप से परिणाम के लिए इस तालिका शामिल हों अतिरिक्त सप्ताह में जोड़ा पाने के लिए

SELECT DATE_FORMAT(date, 'Y:%X - Week:%V') AS regweek, COUNT(date) as number 
    FROM YourTable RIGHT OUTER JOIN Weeks ON WEEK(YourTable.date) = Weeks.WeekNo 

[अपडेट]:। COUNT (तारीख) के उपयोगकर्ता नोट बल्कि COUNT से (*) । COUNT जोड़ते समय SQL कॉलम में दिनांक मान में शून्य मान शामिल नहीं होंगे। चूंकि गायब हफ्तों में उनमें कोई तिथियां नहीं होंगी, इसलिए यह आपको उन हफ्तों के लिए सही ढंग से 0 घटनाएं देगी।

+0

समय की "निरंतर" अवधि होनी चाहिए। मैं इस तरह का पालन करने की कोशिश कर रहा हूं, लेकिन सही हफ्ते उस सप्ताह में कोई घटना नहीं होने पर भी एक विशिष्ट सप्ताह के लिए नंबर = 1 वापस कर देगा, है ना? – Danilo

+1

आपको COUNT (*) से COUNT (दिनांक) को बदलना होगा। चूंकि तिथि "गायब" हफ्तों के लिए पूर्ण होगी, इसलिए इसे गिनती में शामिल नहीं किया जाएगा। मैं अपना जवाब अपडेट करूंगा। –

+0

अद्भुत! यदि मैं गलत नहीं हूं, तो आपके उत्तर को – Danilo

0

यह ऐसी समस्या है जिसके लिए संख्याएं/टैली टेबल बनाए जाते हैं - केवल एक साधारण तालिका जो 0 से जो कुछ भी मायने रखती है। वे सामान्य रूप से उपयोगी होते हैं, मैं हमेशा उन्हें अपने डेटाबेस में जोड़ने की सलाह देता हूं।

इसके साथ आप सप्ताहों की विशिष्ट पूर्व-निर्धारित तालिका की आवश्यकता के बिना आसानी से आसानी से फ्लाई पर सप्ताहों की एक सूची उत्पन्न कर सकते हैं (इसलिए आपको या तो बड़ी मेज की आवश्यकता नहीं है या सप्ताहों से बाहर निकलने की चिंता करने की आवश्यकता नहीं है), फिर शामिल हों कि नियुक्तियों की आपकी सूची के खिलाफ उन सभी नियुक्तियों के साथ सभी सप्ताह दिखाने के लिए।

एक त्वरित शुरुआत के लिए:

declare @min datetime 
set  @min ='2010-01-01' 

select 
    dateadd(wk, number, @min) as weekDate 
from 
    numbers 
where 
    number between 0 and datediff(wk,@min,getdate()) 

साथ

1

अंत में मैं सप्ताह के लिए अस्थायी तालिका बनाने और कोड है कि बाहर पाया गया था का उपयोग कर इस प्रकार इस मुद्दे को हल करने का फैसला किया, ऊपर जवाब दें।

CREATE TEMPORARY TABLE weeks (
     id INT 
     ); 
INSERT INTO weeks (id) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54); 
SELECT 
w.id, COUNT(c.issuedate) as numberPerWeek 
FROM tableName c RIGHT OUTER JOIN weeks w ON WEEK(c.issuedate) = w.id group by w.id; 
+0

आप वास्तव में अपने परिणाम का उत्पादन करने के लिए इस तरह एक अस्थायी संख्या तालिका बना रहे हैं :-) वे एक अच्छी सामान्य तकनीक हैं, जो पढ़ने के लायक हैं। – eftpotrm

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