Question

Je une procédure stockée comme suit:

CREATE PROC [dbo].[Incidents]
(@SiteName varchar(200))
AS
SELECT
(  
    SELECT SUM(i.Logged)  
    FROM tbl_Sites s  
    INNER JOIN tbl_Incidents i  
    ON s.Location = i.Location  
    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
    GROUP BY s.Sites  
)  AS LoggedIncidents

'tbl_Sites contains a list of reported on sites.
'tbl_Incidents contains a generated list of total incidents by site/date (monthly)
'If a site doesn't have any incidents that month it wont be listed.

Le problème que je vais avoir est qu'un site n'a pas d'incidents ce mois-ci et en tant que tel i a obtenu une valeur NULL retournée pour ce site quand je lance ce proc, mais je dois avoir un zéro / 0 retourné à être utilisé dans un graphique dans SSRS.

Je l'ai essayé d'utiliser s'unir et isnull en vain.

    SELECT COALESCE(SUM(c.Logged,0))
    SELECT SUM(ISNULL(c.Logged,0))

Y at-il un moyen d'obtenir ce formaté correctement?

Cheers,

Lee

Était-ce utile?

La solution

Mettre à l'extérieur:

SELECT COALESCE(

(  
    SELECT SUM(i.Logged)  
    FROM tbl_Sites s  
    INNER JOIN tbl_Incidents i  
    ON s.Location = i.Location  
    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
    GROUP BY s.Sites  
), 0)  AS LoggedIncidents

Si vous retournez plusieurs lignes, changer INNER JOIN LEFT JOIN

SELECT COALESCE(SUM(i.Logged),0)
FROM tbl_Sites s  
LEFT JOIN tbl_Incidents i  
ON s.Location = i.Location  
WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
GROUP BY s.Sites  

Par ailleurs, ne mettez pas la fonction ou l'expression à l'intérieur des fonctions d'agrégation si elle est pas justifiée, par exemple ne pas mettre ISNULL, COALESCE intérieur de SUM, en utilisant la fonction / expression dans l'agrégation estropiés performance, la requête sera exécutée avec le balayage de table

Autres conseils

Vous devez utiliser ISNULL comme ça -

ISNULL(SUM(c.Logged), 0)      

Ou, comme Michael a dit, vous pouvez utiliser une jointure externe gauche.

J'ai rencontré ce problème dans Oracle. Oracle n'a pas une fonction ISNULL(). Cependant, nous pouvons utiliser la fonction NVL() pour obtenir le même résultat:

NVL(SUM(c.Logged), 0)

Le plus simple, et la plus lisible, comme je l'ai trouvé d'y arriver est par:

CREATE PROC [dbo].[Incidents]
(@SiteName varchar(200))

AS

    SELECT SUM(COALESCE(i.Logged, 0)) AS LoggedIncidents
    FROM tbl_Sites s  
    INNER JOIN tbl_Incidents i  
    ON s.Location = i.Location  
    WHERE s.Sites = @SiteName 
          AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
    GROUP BY s.Sites  

Vous pouvez envelopper le SELECT dans une autre SELECT comme ceci:

 CREATE PROC [dbo].[Incidents]
(@SiteName varchar(200))

AS

SELECT COALESCE(TotalIncidents  ,0)
FROM (
  SELECT
  (  
    SELECT SUM(i.Logged) as TotalIncidents  
    FROM tbl_Sites s  
    INNER JOIN tbl_Incidents i  
    ON s.Location = i.Location  
    WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)  
    GROUP BY s.Sites  
  )  AS LoggedIncidents
)

Je viens de croiser ce problème, la solution de Kirtan a fonctionné pour moi bien, mais la syntaxe est un peu hors. Je l'ai fait comme ceci:

ISNULL(SUM(c.Logged), 0)

Poster m'a aidé à résoudre mon problème mais si grâce à tous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top