36

次のようなストアドプロシージャがあります。

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.

私が抱えている問題は、サイトに今月インシデントがないことです。そのため、このプロシージャを実行すると、そのサイトに対して NULL 値が返されますが、使用するにはゼロ/0 が返される必要があります。 SSRS のチャート。

合体と isnull を使用してみましたが、役に立ちませんでした。

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

これを正しくフォーマットする方法はありますか?

乾杯、

リー

4

6 に答える 6

59

外に置く:

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

複数の行を返す場合は、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  

ところで、保証されていない場合は、集計関数内に関数または式を入れないでください。たとえば、ISNULL、COALESCE を SUM 内に入れないでください。集計内で関数/式を使用するとパフォーマンスが低下します。クエリはテーブル スキャンで実行されます。

于 2010-05-10T12:57:42.250 に答える
33

このように使用する必要がありますISNULL-

ISNULL(SUM(c.Logged), 0)      

または、Michael が言ったように、Left Outer Join を使用できます。

于 2010-05-10T12:58:33.673 に答える
9

Oracleでこの問題が発生しました。Oracleには機能がありませんISNULL()。ただし、NVL()関数を使用して同じ結果を得ることができます。

NVL(SUM(c.Logged), 0)
于 2016-10-01T00:50:24.930 に答える
3

これを達成するために私が見つけた最も簡単で読みやすい方法は、次のとおりです。

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  
于 2010-05-10T13:10:53.390 に答える
1

次のように、SELECTを別のSELECTでラップできます。

 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
)
于 2010-05-10T12:59:49.520 に答える
1

この問題に遭遇しただけで、Kirtan のソリューションはうまく機能しましたが、構文が少しずれていました。私はこれが好きでした:

ISNULL(SUM(c.Logged), 0)

投稿は私の問題を解決するのに役立ちましたが、すべてに感謝します。

于 2010-08-12T20:04:55.507 に答える