1

私はMS SQL 20012を使用しており、コードは次のようなストアドプロシージャを持っています:

USE [StatsAa]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[DriverVSComp] 
    -- Add the parameters for the stored procedure here
    @PERSON_NO nvarchar(50)
AS
    SET NOCOUNT ON;

DECLARE @weeks int = 26

;WITH Person AS (
   SELECT
     datediff(ww, DATE_GIVEN, getdate())+1 AS Week,
     AVG(CHECK_AMOUNT) AS Person_Check_Amount
   FROM CHECKS
   WHERE PERSON_NO=11  AND DATE_GIVEN >= dateadd(ww, -@weeks, getdate())
   GROUP BY datediff(ww, DATE_GIVEN, getdate()) +1
)

, Company AS (
    SELECT week,
  AVG (COMPANY_Check_Amount) AS COMPANY_Check_Amount
    FROM (
       SELECT
         datediff(ww, DATE_GIVEN, getdate())+1 AS Week,
         SUM(CHECK_AMOUNT)/COUNT(DISTINCT PERSON_NO) AS COMPANY_Check_Amount
       FROM CHECKS
       WHERE PERSON_NO<>11  AND DATE_GIVEN >= dateadd(ww, -@weeks, getdate())
       GROUP BY datediff(ww, DATE_GIVEN, getdate())+1 
    ) t
  GROUP BY Week
)

SELECT c.week
 , isnull(Person_Check_Amount,0)  Person_Check_Amount
 , isnull(Company_Check_Amount,0) Company_Check_Amount
FROM Person p
FULL OUTER JOIN Company c ON c.week = p.week
ORDER BY Week DESC

しかし、私はこのエラーを受け取り続けます:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' 

[Microsoft][SQL Server Native Client 11.0][SQL Server]Divide by zero error encountered. 

MSSMS から実行すると、正常に動作し、結果が表示されますが、次のコマンドを 1 回実行した後でのみです。

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF

しかし、ページ (.asp ページ) を実行するとエラーが引き続き発生します。

これは一部の値が Null であるためだと読んでいましたが、これを安全にストアド プロシージャに入れるにはどうすればよいですか? ドライバーとコンプをオフセットするため、Null 値があるため、データが失われたり、渡されたり、無視されたりしないことが非常に重要です。データと平均。NULL に遭遇したときにゼロ '0' またはデフォルト値を設定することは可能ですか? また、問題を引き起こしている列/行を見つけるにはどうすればよいですか。

いつものように、事前に助けてくれてありがとう!

4

1 に答える 1

1

次の 2 つのケースのいずれかで、この式で 0 による除算エラーが発生します。1) 特定の週のレコードがない、および b) その週のすべての PERSON_NO が NULL である (列が null 可能であると仮定)

SUM(CHECK_AMOUNT)/COUNT(DISTINCT PERSON_NO) AS COMPANY_Check_Amount

これを次のように置き換えてみてください。

CASE WHEN COUNT(DISTINCT PERSON_NO) = 0 THEN 0
ELSE SUM(CHECK_AMOUNT)/COUNT(DISTINCT PERSON_NO) 
END AS COMPANY_Check_Amount
于 2013-07-01T17:42:13.793 に答える