2011-03-25 36 views
1

我正在寫一個返回排序列表的第一個值的SQL函數,但我真的不知道如何開始?該函數只有一個參數,即上市數量(VRI.Listing_Number如何創建一個返回SQL中排序列表的第一個值的函數?

使用select聲明,我有:

SELECT TOP 1 
     --VRI.Listing_RID, VRI.Listing_Number, VRI.Listing_Price, CH.Old_Price, CH.Date_Time_Changed 
     CH.Old_Price 
FROM dbo.View_Report_Information_Tables VRI WITH (NOLOCK) 
     INNER JOIN dbo.MLS_Change_History CH WITH (NOLOCK) ON 
      VRI.Listing_RID = CH.Listing_RID 
     INNER JOIN dbo.MLS_Change_History_Type CHT WITH (NOLOCK) ON 
      CH.Transaction_RID = CHT.Transaction_RID 
WHERE CHT.Change_Type_Display = 3 AND 
     VRI.Listing_RID = CH.LISTING_RID 
ORDER BY CH.Transaction_RID DESC 

該SQL查詢將返回價格列表的最後價格的變化。

我對sql很陌生,所以我甚至不太明白語法。例如,我擡頭看CH.Old_Price,我看到它TYPE_NAMEnumeric,但它也有長度和精度,規模....這個函數應該返回什麼值?

有什麼想法?

感謝,

+1

是什麼問題?函數的語法?這個'select'語句是否返回你想要的? – vlad 2011-03-25 22:16:02

+0

@vlad:當然,語法,也許是一些解釋。對不起,一個來自DBA的人向我發送了這個sql查詢,並要求我玩弄它,但我完全不熟悉sql函數:(所以我真的不知道從哪裏開始,除了去stackoverflow^_ ^! – Chan 2011-03-25 22:18:00

回答

1
CREATE FUNCTION dbo.FirstPriceChange(@Listing_Number int) 
RETURNS MONEY 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
RETURN (
    SELECT TOP 1 
      CH.Old_Price 
    FROM dbo.View_Report_Information_Tables VRI WITH (NOLOCK) 
      INNER JOIN dbo.MLS_Change_History CH WITH (NOLOCK) ON 
       VRI.Listing_RID = CH.Listing_RID 
      INNER JOIN dbo.MLS_Change_History_Type CHT WITH (NOLOCK) ON 
       CH.Transaction_RID = CHT.Transaction_RID 
    WHERE CHT.Change_Type_Display = 3 AND 
      VRI.Listing_RID = CH.LISTING_RID AND 
      VRI.Listing_Number = @Listing_Number 
    ORDER BY CH.Transaction_RID DESC 
) 
END 
GO 

使用範例:

SELECT 
    VRI.Listing_RID, VRI.col1, VRI.Col2, 
    dbo.FirstPriceChange(VRI.Listing_Number) AS FirstPriceChange 
FROM dbo.View_Report_Information_Tables VRI 

注:

  1. RETURNS MONEY它返回一個貨幣型
  2. WITH RETURNS NULL ON NULL INPUT如果輸入爲空,只是返回null
  3. 的回報是一個來自子查詢的值與VRI的值。 Listing_Number filter added
+0

非常清楚的解釋,對於像我這樣的sql-noob非常有用,非常感謝。順便說一句,如果'VRI.Old_Price'是數字類型,它會有什麼區別? – Chan 2011-03-25 22:29:52

+0

@Chan - 改變返回類型(money)以匹配列,所以它會是'numeric(n,m)' – RichardTheKiwi 2011-03-25 22:57:56

+0

明白了。謝謝。 – Chan 2011-03-25 23:44:15

0
SELECT TOP 1 FROM (

SELECT * 
FROM dbo.View_Report_Information_Tables VRI WITH (NOLOCK) 
     INNER JOIN dbo.MLS_Change_History CH WITH (NOLOCK) ON 
      VRI.Listing_RID = CH.Listing_RID 
     INNER JOIN dbo.MLS_Change_History_Type CHT WITH (NOLOCK) ON 
      CH.Transaction_RID = CHT.Transaction_RID 
WHERE CHT.Change_Type_Display = 3 AND 
     VRI.Listing_RID = CH.LISTING_RID 
ORDER BY CH.Transaction_RID DESC 

) AS `aaa` 
1

假設你貼返回正確的數據select語句,函數的語法很簡單:

CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> 
( 
-- Add the parameters for the function here 
@Listing_Number int, 
) 
RETURNS TABLE 
AS 
RETURN 
(
-- Add the SELECT statement with parameter references here 
) 

,您還可以通過右鍵單擊Functions得到這個在SSMS-> Object Explorer - > - > Programmability中選擇正確的函數類型。我上面的示例假設它返回整行數據(這似乎是這種情況)。我還假定VRI.Listing_Number是一個int。

相關問題