2011-10-20 107 views
0

我會盡我所能讓這個問題比我最後的失敗更好。我得到了可怕的「無法找到任何一列」dbo「或用戶定義的函數或聚合」dbo.PriMonthAvgPrice「,或名稱不明確<UDF表UDV或標量UDF?

我試圖找到平均銷售價格。上個月這裏是我的UDF:

USE [WoodProduction] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER FUNCTION [dbo].[PriMonthAvgPrice] 
(
-- Add the parameters for the function here 
@endofmonth  datetime, 
@begofmonth  datetime, 
@PlantCode  varchar 
) 
RETURNS decimal (10,2) 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @MonthEndAvgPrice decimal (10,2) 

-- Add the T-SQL statements to compute the return value here 
SELECT @MonthEndAvgPrice = 

(
    select 

     sum(Actual_Sales_Dollars/Actual_Volume) 

     FROM 

     woodproduction.dbo.plywood_layup_sales pls 
     WHERE 

     Production_Date between @begofmonth and @endofmonth 
     and actual_volume <> 0 
     and @PlantCode = pls.Plant_Code 


) 

-- Return the result of the function 
RETURN @MonthEndAvgPrice 

END 

這是我從我的查詢的SELECT語句:

SELECT 
DISTINCT  
    P.[Plant_Number] 
    ,p.plant_name 
,pls.plant_code 
    ,(pls.[Budget_Realization]) AS 'BR' 
    ,(pls.[Actual_Volume]) AS 'AV' 
    ,(pls.[Budget_Volume]) AS 'BV' 
--,sum (dpb.[Gross_Production_Per_Hr]) AS 'GPB' 
    ,(p.Production_Volume) AS 'PV' 
    ,CASE 
     WHEN coalesce (pls.[Actual_Volume],0) = 0 and 
       coalesce (pls.[Actual_Sales_Dollars],0) = 0 
       THEN 0 
     ELSE (pls.[Actual_Sales_Dollars]/pls.[Actual_Volume]) 
    END 
    AS 'AP' 
    ,pls.production_date 
    ,[dbo].[PriMonthAvgPrice](@endofmonth,@begofmonth, pls.plant_code) AS 'PriMoAvgPrice' 

我基本的理解是,我創建了一個標量函數從我一直在讀。但是,關於我的錯誤,這個錯誤在TVF上返回這是真的嗎?在處理之前我創建了一個SVF,只是確定前一個月的結束日期,因此它不像我在UDF中創建查詢那樣涉及到。

我需要將其更改爲TVF嗎?如果是這樣,當我必須連同多個表一起使用時,如何合併SELECT *?

在此先感謝。

亞倫

+1

是否有'FROM'條款有太多? – JNK

+0

我有點懷疑,因爲我在你的函數中看到一個數據庫名稱限定的表引用('woodproduction.dbo.plywood_layup_sales')。你是否在創建函數的同一個數據庫中運行這個查詢? –

+0

[Actual_Sales_Dollars]/pls。[Actual_Volume])=當你的列都是整數時,要小心整數數學。另外,我通常會在任何分區中放入一個零分支檢查,這樣如果底部數字爲0或空值,它就不會冒風險。你知道你的數據,也許它不需要,但這是一個很好的習慣。很多時候我有一個意想不到的零。 – HLGEM

回答

1

你沒有表現from子句,但在數據庫創建中的一部分功能是什麼?

如果您完全限定名稱(包括數據庫),是否可以使用?

你有沒有獨立與測試功能:

select [dbo].[PriMonthAvgPrice] ('01/01/2011', '02/01/2011', 'test') 

注:你當然會使用應返回結果的一些實際值。

請運行此並告訴我們返回的值:

SELECT Actual_Sales_Dollars,Actual_Volume, pls.PLant_code   
FROM woodproduction.dbo.plywood_layup_sales pls   
WHERE Production_Date between '09-01-2011' and '09-30-2011'   
     and actual_volume <> 0  
+0

對不起@JNK。我知道我會錯過一些東西。 'FROM woodproduction.dbo.plywood_layup_sales PLS 內加入@Production p Ñp.plant_number = pls.plant_number \t和p.production_date = pls.production_date \t WHERE \t MONTH(p.production_date)=月( @monthtodate) \t和pls。actual_volume <> 0' –

+0

@Joe Stefanelli:我是。同樣的查詢也在我對數據集的主要查詢中。但在這種情況下,UDF正在獲取上個月末的數據,並將其插入到設置爲返回MTD的數據集中。所以我被告知這是做這件事的最好方法。我試圖儘可能模仿之前的UDF。 –

+0

我做到了。是否正確是一個不同的故事。目前我得到NULL。我知道查詢自行工作,所以我不知道爲什麼我得到NULL。我的老闆說這會很簡單。當然,如果我有超過3個月的SQL在我的腰帶之下。和基本的SQL在那。 –