2009-02-26 11 views
5

मैं एमएस एसक्यूएल सर्वर का उपयोग कर रहा हूं लेकिन अन्य डेटाबेस से तुलनात्मक समाधान का स्वागत करता हूं।मैं एक ग्रुप बाय डे (डेट_फील्ड) एसक्यूएल क्वेरी में खाली पंक्तियों को कैसे शामिल करूं?

यह मेरी क्वेरी का मूल रूप है।

SELECT 
    COUNT(*) AS "Calls", 
    MAX(open_time), 
    open_day 
FROM 
    (
SELECT 
incident_id, 
opened_by, 
open_time - (9.0/24) AS open_time, 
DATEPART(dd, (open_time-(9.0/24))) AS open_day 
    FROM incidentsm1 
    WHERE 
DATEDIFF(DAY, open_time-(9.0/24), GETDATE())< 7 

) inc1 
GROUP BY open_day 

यह डेटा एक बार ग्राफ आकर्षित करने के लिए प्रयोग किया जाता है, लेकिन अगर वहाँ सप्ताह के किसी दिन विशेष पर कोई कॉल थे, वहाँ कोई परिणाम है: यह incidentsm1 'तालिका से प्रतिदिन कॉल की संख्या देता है पंक्ति और इस प्रकार कोई बार नहीं है, और उपयोगकर्ता जैसा है, "ग्राफ में केवल छह दिन क्यों हैं और शनिवार से सोमवार तक छोड़ते हैं?"

किसी भी तरह से मुझे प्रत्येक दिन या किसी चीज़ से रिक्त पंक्ति के साथ सभी को यूनियन करने की आवश्यकता है, लेकिन मैं इसे समझ नहीं सकता।

मैं एक एसक्यूएल कथन के साथ क्या कर सकता हूं इसके लिए बाध्य हूं और मैंने केवल पढ़ने के लिए उपयोग किया है इसलिए मैं एक अस्थायी तालिका या कुछ भी नहीं बना सकता।

+0

बस इसे अपनी यूआई परत में जोड़ें। http://stackoverflow.com/questions/346659/what-are-the-most-common-sql-anti-patterns/346850#346850 –

+0

क्षमा करें, मैं चाहता हूं, लेकिन फैंसी वाणिज्यिक टूल के साथ यह असंभव है उपयोग। – Nathan

उत्तर

7

इस तरह कुछ कैसे?

SELECT 
    COUNT(incident_id) AS "Calls", 
    MAX(open_time), 
    days.open_day 
FROM 
(
    select datepart(dd,dateadd(day,-6,getdate())) as open_day union 
    select datepart(dd,dateadd(day,-5,getdate())) as open_day union 
    select datepart(dd,dateadd(day,-4,getdate())) as open_day union 
    select datepart(dd,dateadd(day,-3,getdate())) as open_day union 
    select datepart(dd,dateadd(day,-2,getdate())) as open_day union 
    select datepart(dd,dateadd(day,-1,getdate())) as open_day union 
    select datepart(dd,dateadd(day, 0,getdate())) as open_day 
) days 
left join 
(
SELECT 
    incident_id, 
    opened_by, 
    open_time - (9.0/24) AS open_time, 
    DATEPART(dd, (open_time-(9.0/24))) AS open_day 
FROM incidentsm1 
WHERE DATEDIFF(DAY, open_time-(9.0/24), GETDATE()) < 7 
) inc1 ON days.open_day = incidents.open_day 
GROUP BY days.open_day 

मैंने इसे केवल सरलीकृत तालिका स्कीमा पर परीक्षण किया है, लेकिन मुझे लगता है कि इसे काम करना चाहिए। आपको डेटड सामान के साथ टिंकर करने की आवश्यकता हो सकती है ..

+0

धन्यवाद! मैं कुछ और लूपिश की उम्मीद कर रहा था लेकिन वर्चुअल डेट टेबल बनाने के लिए मैं 7 लाइनों को पेट कर सकता हूं। एनबी, मैं में शामिल होने का 'ON' खंड जोड़ने के लिए यह काम करने के लिए पाने के लिए था: ) inc1 पर days.open_day = incidents.open_day ग्रुप days.open_day द्वारा Btw, न्यूजीलैंड जहां जंगली है चिज़े हैं? – Nathan

+0

ओह धन्यवाद, तय। हां, हमारे पास दुष्कर्म है .. tuataras .. और बहुत बड़ा .. kiwis .. हाँ। – Blorgbeard

+0

आप मेरे नायक हैं। – Nathan

0

क्या आप अपनी तिथियों के साथ तालिका चर बना सकते हैं और फिर RIGHT JOIN पर इसे बना सकते हैं? उदाहरण के लिए,

DECLARE @dateTable TABLE ([date] SMALLDATETIME) 

INSERT INTO @dateTable 
VALUES('26 FEB 2009') 
INSERT INTO @dateTable 
VALUES('27 FEB 2009') 
-- etc 

SELECT 
    COUNT(*) AS "Calls", 
    MAX(open_time), 
    open_day 
FROM 
    (
SELECT 
incident_id, 
opened_by, 
open_time - (9.0/24) AS open_time, 
DATEPART(dd, (open_time-(9.0/24))) AS open_day 
    FROM incidentsm1 
    RIGHT JOIN @dateTable dates 
    ON incidentsm1.open_day = dates.date 
    WHERE 
DATEDIFF(DAY, open_time-(9.0/24), GETDATE())< 7 

) inc1 
GROUP BY open_day 

अधिक आदर्श स्थिति हालांकि,

+0

मैं केवल एक SQL कथन का उपयोग कर सकता हूं, इसलिए ऐसा लगता है कि मैं 'DECLARE' प्रीपेड कर सकता हूं लेकिन मैं अपने SELECT कथन में डेटा सम्मिलित नहीं कर सकता। – Nathan

0

में दिनांक के साथ एक मेज वस्तु के लिए मैं एक date table के उपयोग का सुझाव होगा। मौजूदा तिथि तालिका के साथ, आप अपने लापता दिनों को लाने के लिए तिथि तालिका में एक सही बाहरी जॉइन कर सकते हैं।

+0

क्षमा करें, मेरे पास केवल पढ़ने के लिए पहुंच है। मैं एक तिथि कॉलम में शामिल होने का सहारा ले सकता हूं, मुझे यकीन है कि हर दिन हमेशा के लिए एक मूल्य होगा, लेकिन ऐसा लगता है कि एक बेहतर तरीका होना चाहिए। – Nathan

0

क्या आप अपनी क्वेरी के हिस्से के रूप में तिथियों का सेट बना सकते हैं? की तर्ज पर कुछ:

SELECT COUNT(*) AS Calls, ... 
    FROM incidentsm1 RIGHT OUTER JOIN 
     (SELECT date_values 
      FROM TABLE(('27 Feb 2009'), ('28 Feb 2009'), ('1 Mar 2009'), 
         ('2 Mar 2009'), ('3 Mar 2009'), ('4 Mar 2009'), 
         ('5 Mar 2009')) AS date_list 
     ) 
     ON ... 

यह इन्फोर्मिक्स और डीबी 2 अंकन का संकर का एक तरह से प्रेरित है और काफी की गारंटी है दोनों में वाक्य रचना गलत। असल में, क्या आपके डीबीएमएस में फ्लाई पर एक शाब्दिक टेबल बनाने का कोई तरीका है। एक संभावना - बदसूरत लेकिन मुश्किल से करने योग्य - 'दोहरी' या कुछ तालिका अभिव्यक्ति से चुने गए दिनांक अक्षरों का 7-रास्ता यूनियन करना होगा जो एक पंक्ति की गारंटी देता है (इनफॉर्मिक्स शर्तों में, SELECT MDY(2,28,2009) FROM "informix".systables WHERE tabid = 1 UNION ...)।

+0

एमएसएसक्यूएल में कोई ड्यूल नहीं है, हालांकि मुझे अभी भी 'इन' (http://technet.microsoft.com/en-us/library/ms175972(SQL.90).aspx) का उपयोग करके भाग्य हो सकता है ... इसके अलावा, मुझे चाहिए यह क्वेरी नियमित रूप से चलाने के लिए है, इसलिए मैं तिथियों को हार्डकोड नहीं कर सकता लेकिन उन्हें किसी भी तरह की गणना करना है, शायद 'DATEADD (DAY, -1, GETDATE())' – Nathan

+0

पर्याप्त मेला; इनफॉर्मिक्स में, यह आज होगा - 1, आदि ... –

+0

नोट, एमएसएसएलएल में डीयूएएल की कोई आवश्यकता नहीं है, क्योंकि आपको क्लॉज की आवश्यकता नहीं है - जहां तक ​​डीयूएएल की मेरी समझ है :) – Blorgbeard

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