2012-10-05 19 views
5

Estoy realizando un conteo basado en un rango de fechas. Actualmente, la consulta devuelve el resultado correcto, pero requiero información adicional. En su forma actual, la consulta muestra el artículo con el recuento correcto. Sin embargo, necesito que se muestren todos los elementos, incluso si su recuento es cero para el intervalo de fechas especificado.SQL - Devolver todas las filas, incluso si el recuento es cero para el elemento

Este es el código 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 

Cuando ejecuto esta consulta me sale el siguiente resultado:

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

Este resultado es correcto, sin embargo necesito todos los tipos de requisitos para estar lista , incluso si no hay requisitos en el rango de creación, es decir,

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

He intentado usar varias uniones, IFNULL e ISNULL, pero no tengo nada para trabajar.

Si alguien pudiera señalarme en la dirección correcta, lo agradecería.

+0

uso. – Ben

Respuesta

2

Modificar la segunda consulta

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

Gracias Alexander, esta modificación devuelve el conjunto de resultados que estoy buscando, muy apreciado. – user1454112

+0

Buena suerte @ user1454112 –

0

Creo que tendrá que contar CCount.BaselineID y utilizar una combinación izquierda Si usted cuenta con Tree.Type que no puedes tener un cero en filas sin partido
y usted sabe que el intervalo de fechas volverá a cero

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

Gracias por echar un vistazo a este Blam – user1454112

+0

¿Lo intentó? Esto usará e indexará en [Tree]. [CreationDate]. – Paparazzi

1

en términos generales, para obtener registros con recuentos de 0, necesita una combinación externa de algún tipo para que cuente las filas que no tienen ningún partido. Incluso puede usar una combinación cruzada de todas las opciones para las que desea contar. Alternativamente, a menudo implemento este tipo de conteo usando una subconsulta correlacionada. Aquí hay un par de ejemplos generales:

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

Otra posibilidad, si usted tiene una consulta de trabajo, es hackear juntos algo como esto: "unirse externa"

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

Gracias por la respuesta Tim, le agradezco que se tome el tiempo para mirar esto – user1454112

+0

Claro. Afortunadamente, todas las respuestas dejan en claro por qué no obtuviste ceros y cómo conseguirlos. –

Cuestiones relacionadas