2012-10-05 8 views
5

के लिए गिनती शून्य होने पर भी सभी पंक्तियों को वापस कर रहा है, मैं दिनांक सीमा के आधार पर एक गणना कर रहा हूं। वर्तमान में क्वेरी सही परिणाम लौटाती है लेकिन मुझे अतिरिक्त जानकारी की आवश्यकता है। वर्तमान स्वरूप में, क्वेरी आइटम को सही गिनती से दिखाती है। हालांकि मुझे सभी वस्तुओं को दिखाने की ज़रूरत है, भले ही उनकी गणना निर्दिष्ट दिनांक सीमा के लिए शून्य हो।एसक्यूएल - आइटम

INSERT INTO @CreationCount (BaselineID, Name) 

SELECT distinct [BaselineID],[Name] 
FROM [Baseline_INFO] 

DECLARE @ReqType TABLE (Type nvarchar(128)) 
INSERT INTO @ReqType (Type) 
SELECT DISTINCT Tree.Type as 'Requirement Type' 
FROM [TREE] 
INNER JOIN [Project_INFO] ON [Project_INFO].[ProjectID]=[Tree].[Project_ID] 
INNER JOIN [Baseline_INFO] ON [Baseline_INFO].[BaselineID]=[Tree].[Baseline_ID] 
WHERE [Project_INFO].[Name] = 'Address Book' AND [Baseline_INFO].[Name] = 'Current 
Baseline' 
Group By Tree.Type 

SELECT Tree.Type as 'Requirement Type', COUNT(Tree.Type) as 'Number in Creation Range' 
FROM [Tree] 
INNER JOIN @ReqType As RT on RT.Type = Tree.Type 
INNER JOIN [Project_INFO] ON [Project_INFO].[ProjectID]=[Tree].[Project_ID] 
INNER JOIN @CreationCount AS CCount ON CCount.BaselineID=Tree.Baseline_ID 
WHERE [Project_INFO].[Name] = 'Address Book' AND CCount.Name = 'Current Baseline' 
AND [Tree].[creationDate] >= ('2010-01-01') and [Tree].[creationDate] < ('2020-01-01') 
GROUP BY tree.Type 

जब मैं इस क्वेरी मैं निम्नलिखित परिणाम प्राप्त निष्पादित करें:: सूची होने के लिए

https://dl.dropbox.com/u/17234826/SQLresult.png

यह परिणाम सही है लेकिन मैं सभी आवश्यकता प्रकार की जरूरत है

यहाँ एसक्यूएल कोड है , भले ही निर्माण श्रेणी में कोई आवश्यकता न हो, यानी

https://dl.dropbox.com/u/17234826/SQLresult1.png

मैंने विभिन्न जॉइन, इफनुल और आईएसएनयूएलएल का उपयोग करने की कोशिश की है लेकिन मुझे काम करने के लिए कुछ भी नहीं मिला है।

अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं इसकी सराहना करता हूं।

+0

उपयोग "बाहरी में शामिल होने के" यहाँ सामान्य उदाहरण के एक जोड़े हैं। – Ben

उत्तर

2

दूसरा क्वेरी

SELECT Tree.Type as 'Requirement Type', 
     COUNT(CASE WHEN [Tree].[creationDate] >= ('2010-01-01') and [Tree].[creationDate] < ('2020-01-01') THEN Tree.Type END) AS 'Number in Creation Range' 
FROM [Tree] 
INNER JOIN @ReqType As RT on RT.Type = Tree.Type 
INNER JOIN [Project_INFO] ON [Project_INFO].[ProjectID]=[Tree].[Project_ID] 
INNER JOIN @CreationCount AS CCount ON CCount.BaselineID=Tree.Baseline_ID 
WHERE [Project_INFO].[Name] = 'Address Book' AND CCount.Name = 'Current Baseline' 
GROUP BY tree.Type 
+0

धन्यवाद अलेक्जेंडर, यह संशोधन परिणाम सेट को लौटाता है जिसे मैं ढूंढ रहा हूं, बहुत सराहना की। – user1454112

+0

शुभकामनाएं @ user1454112 –

0

मैं CCount.BaselineID गिनती और एक बाएं का उपयोग करने की आवश्यकता होगी लगता है में शामिल होने को संशोधित आप Tree.Type पर भरोसा है तो आप कोई मुकाबला नहीं के साथ पंक्तियों पर एक शून्य नहीं होगा
और तुम्हें पता है कि दिनांक सीमा शून्य

SELECT Tree.Type as 'Requirement Type' 
    , COUNT(CCount.BaselineID) as 'Number in Creation Range' 
FROM [Tree] 
INNER JOIN @ReqType As RT 
    on RT.Type = Tree.Type 
INNER JOIN [Project_INFO] 
    ON [Project_INFO].[ProjectID] = [Tree].[Project_ID] 
OUTER JOIN @CreationCount AS CCount 
    ON CCount.BaselineID=Tree.Baseline_ID 
WHERE [Project_INFO].[Name] = 'Address Book' 
    AND CCount.Name = 'Current Baseline' 
    AND [Tree].[creationDate] >= ('2010-01-01') 
    and [Tree].[creationDate] < ('2020-01-01') 
GROUP BY tree.Type 
+0

इस ब्लैम – user1454112

+0

पर एक नज़र डालने के लिए धन्यवाद क्या आपने इसे आजमाया? यह [वृक्ष] पर उपयोग और अनुक्रमित करेगा। [निर्माण दिनांक]। – Paparazzi

1
आम तौर पर

बोल वापस आ जाएगी, 0 की गिनती के साथ रिकॉर्ड प्राप्त करने के लिए, आप पंक्तियों कोई मुकाबला नहीं है कि गिनती एक बाहरी किसी प्रकार की में शामिल होने की जरूरत है। आप उन सभी विकल्पों के क्रॉस-इन-इन का भी उपयोग कर सकते हैं जिनके लिए आप गणना करना चाहते हैं। वैकल्पिक रूप से, मैं अक्सर एक सहसंबंधित सबक्वायरी का उपयोग करके इस प्रकार की गिनती को लागू करता हूं।

-- Get count using left join 
select c.customer_id, 
    count(o.order_id) as num 
from customers c 
    left join orders o on c.customer_id = o.customer_id 
group by c.customer_id 

-- Get count using correlated subquery 
select c.customer_id, 
    (select count(*) from orders where customer_id = c.customer_id) as Num 
from customers c 

एक और संभावना है, यदि आप एक काम कर क्वेरी मिल गया है, एक साथ कुछ इस तरह हैक करने के लिए है:

-- Create a cte of the original query that we will use multiple times 
;WITH cte as (
    SELECT Tree.Type as 'Requirement Type' 
     , COUNT(Tree.Type) as 'Number in Creation Range' 
    FROM [Tree] 
     INNER JOIN @ReqType As RT on RT.Type = Tree.Type 
     INNER JOIN [Project_INFO] ON [Project_INFO].[ProjectID]=[Tree].[Project_ID] 
     INNER JOIN @CreationCount AS CCount ON CCount.BaselineID=Tree.Baseline_ID 
    WHERE [Project_INFO].[Name] = 'Address Book' AND CCount.Name = 'Current Baseline' 
     AND [Tree].[creationDate] >= ('2010-01-01') and [Tree].[creationDate] < ('2020-01-01') 
    GROUP BY tree.Type 
) 
-- Grab the counts of records with matches 
select * 
from cte 
-- Grab the zero counts (records not in the original query) 
union all 
select Tree.Type, 0 
from [Tree] 
where Tree.Type not in (
    select Tree.Type 
    from cte 
) 
+0

प्रतिक्रिया टिम के लिए धन्यवाद, मैं आपको – user1454112

+0

निश्चित रूप से देखने के लिए समय निकालने की सराहना करता हूं। उम्मीद है कि सभी उत्तर इसे कुछ हद तक स्पष्ट करते हैं कि आपको शून्य क्यों नहीं मिल रहे थे, और उन्हें प्राप्त करने के बारे में कैसे जाना है। –

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