2012-10-05 50 views
5

Tôi đang thực hiện một số dựa trên phạm vi ngày. Hiện tại truy vấn không trả về kết quả chính xác nhưng tôi yêu cầu thông tin bổ sung. Trong biểu mẫu hiện tại của nó, truy vấn hiển thị mục có số lượng chính xác. Tuy nhiên tôi cần tất cả các mục được hiển thị, ngay cả khi số lượng của chúng là 0 cho phạm vi ngày được chỉ định.SQL - Trả về tất cả các hàng ngay cả khi số không là cho mục

Đây là đoạn mã SQL:

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 

Khi tôi thực hiện truy vấn này tôi nhận được kết quả sau:

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

Kết quả này là đúng tuy nhiên tôi cần tất cả các loại yêu cầu để có danh sách , ngay cả khi không có yêu cầu nào trong phạm vi tạo, tức là

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

Tôi đã thử sử dụng các kết nối khác nhau, IFNULL và ISNULL nhưng tôi không có gì để làm việc.

Nếu ai đó có thể chỉ cho tôi đúng hướng, tôi sẽ đánh giá cao điều đó.

+0

sử dụng "bên ngoài tham gia". – Ben

Trả lời

2

Sửa đổi các truy vấn thứ hai

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

Cảm ơn Alexander, sửa đổi này trả về tập hợp kết quả mà tôi đang tìm kiếm, được đánh giá cao. – user1454112

+0

Chúc may mắn @ user1454112 –

0

Tôi nghĩ rằng sẽ cần phải đếm CCount.BaselineID và sử dụng một trái tham gia Nếu bạn tin tưởng vào Tree.Type bạn sẽ không nhận được một số không trên các hàng không có trận đấu
và bạn biết rằng phạm vi ngày sẽ trở lại zero

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

Cảm ơn bạn đã xem Blam này – user1454112

+0

Bạn đã thử chưa? Điều này sẽ sử dụng và lập chỉ mục trên [Cây]. [CreationDate]. – Paparazzi

1

nói chung, để có được hồ sơ với tội danh 0, bạn cần một bên ngoài tham gia của một số loại, do đó bạn đếm hàng có không phù hợp. Bạn thậm chí có thể sử dụng tính năng tham gia chéo của tất cả các tùy chọn bạn muốn tính. Ngoài ra, tôi thường triển khai loại đếm này bằng cách sử dụng truy vấn con tương quan. Dưới đây là một vài ví dụ tổng quát:

-- 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 

Một khả năng khác, nếu bạn đã có một truy vấn làm việc, là để hack cùng một cái gì đó như thế này:

-- 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

Cảm ơn bạn đã trả lời Tim, tôi đánh giá cao việc bạn dành thời gian để xem điều này – user1454112

+0

Chắc chắn. Hy vọng rằng tất cả các câu trả lời làm cho nó hơi rõ ràng lý do tại sao bạn không nhận được số không, và làm thế nào để đi về nhận được chúng. –

Các vấn đề liên quan