次のようなストアドプロシージャがあります。
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のチャート。
合体と無効を使用してみました。
SELECT COALESCE(SUM(c.Logged,0))
SELECT SUM(ISNULL(c.Logged,0))
これを正しくフォーマットする方法はありますか?
乾杯、
リー
外に出す:
SELECT COALESCE(
(
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
), 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.Location
WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)
GROUP BY s.Sites
ちなみに、保証されていない場合は、集計関数内に関数や式を入れないでください。 ISNULL、COALESCEをSUMの内部に配置しないでください。集約のパフォーマンスに関数/式を使用すると、クエリはテーブルスキャンで実行されます。
このようにISNULL
を使用する必要があります-
ISNULL(SUM(c.Logged), 0)
または、マイケルが言ったように、左外部結合を使用できます。
Oracleでこの問題が発生しました。 OracleにはISNULL()
関数がありません。ただし、NVL()
関数を使用して同じ結果を得ることができます。
NVL(SUM(c.Logged), 0)
これを達成するために私が見つけた最も簡単で、最も読みやすい方法は次のとおりです。
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
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
)
この問題に遭遇しただけで、Kirtanのソリューションはうまく機能しましたが、構文は少しずれていました。私はこれが好きでした:
ISNULL(SUM(c.Logged), 0)
投稿は私の問題を解決するのに役立ちましたが、すべてに感謝します。