7

日付範囲に基づいてカウントを実行しています。現在、クエリは正しい結果を返しますが、追加情報が必要です。現在の形式では、クエリは正しい数のアイテムを表示します。ただし、指定された日付範囲のカウントがゼロであっても、すべてのアイテムを表示する必要があります。

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

このクエリを実行すると、次の結果が得られます。

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

この結果は正しいですが、作成範囲に要件がない場合でも、すべての要件タイプをリストにする必要があります。

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

さまざまな結合、IFNULL および ISNULL を使用してみましたが、何も機能しません。

誰かが私を正しい方向に向けることができれば、私はそれを感謝します.

4

3 に答える 3

3

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
于 2012-10-05T14:14:17.840 に答える
2

一般的に言えば、カウントが 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
)
于 2012-10-05T14:16:56.097 に答える
1

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
于 2012-10-05T14:16:15.483 に答える