2011-03-25 69 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。

相关问题