0

この Median 関数を書きましたが、実行中にエラーが発生しました。コードの何が問題なのか教えてもらえますか?

BEGIN
    CREATE TABLE #ITEMORDERDETAILS
      (
         ITEM   CHAR(15),
         QTYSHP DECIMAL(21, 6),
         RQDATE DATETIME
      )

    DECLARE @Median FLOAT
    DECLARE @ITEM CHAR(15)
    DECLARE @ORDERCNT INT

    SET @ITEM=@ITEMN

    INSERT #ITEMORDERDETAILS
    SELECT ITEM,
           QTYSHP,
           RQDATE
    FROM   tbl123456
    WHERE  PRICE != '0'
           AND SALESMN != 'WB'
           AND RQDATE > ( getdate () - 180 )
           AND ITEM = @ITEM
    UNION
    SELECT ITEM,
           QTYSHP,
           RQDATE
    FROM   tbl123
    WHERE  PRICE != '0'
           AND SALESMN != 'WB'
           AND RQDATE > ( getdate () - 180 )
           AND ITEM = @ITEM

    SELECT @ORDERCNT = count (1)
    FROM   #ITEMORDERDETAILS

    --SELECT @ORDERCNT
    SELECT @Median = ( sum(QTYSHP) / @ORDERCNT )
    FROM   #ITEMORDERDETAILS

    SELECT @Median AS 'Median'

    --SELECT * from #ITEMORDERDETAILS
    DROP TABLE #ITEMORDERDETAILS

    RETURN @Median
END 

エラー

メッセージ 2772、レベル 16、状態 1、プロシージャ f_Get_Average_Order_Size_Median、行 34 関数内から一時テーブルにアクセスできません。

メッセージ 2772、レベル 16、状態 1、プロシージャ f_Get_Average_Order_Size_Median、行 35 関数内から一時テーブルにアクセスできません。

メッセージ 2772、レベル 16、状態 1、プロシージャ f_Get_Average_Order_Size_Median、行 42 関数内から一時テーブルにアクセスできません。

メッセージ 156、レベル 15、状態 1、プロシージャ f_Get_Average_Order_Size_Median、行 46 キーワード「SELECT」付近の構文が正しくありません。

4

1 に答える 1

1

理由はエラーメッセージにあります:

Line 34 Cannot access temporary tables from within a function

関数を作ると、アクセスできるものに制限があります。

ただし、SQL Server 2012を使用する場合は、独自の中央値関数を記述する必要はありませんが、PERCENTILE_DISCを使用できます。

PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY XXXX) 
                      OVER (PARTITION BY YYYY) AS Median
于 2013-10-29T13:54:00.960 に答える