2013-03-22 35 views
0

我想创建一个函数,其中用户输入一个日期,然后收到一个表。 函数返回每天显示的表格(transdate)什么类型的邮件进来以及有多少,然后生成特定于每种邮件类型的运行总数。它作为select语句正常工作,但是当我尝试并将函数格式放入时,我收到错误: “Select函数中包含的Select语句无法将数据返回给客户端。”函数内的SELECT语句 - 别名,与临时表...等

CREATE FUNCTION DailyMailCount(@Date datetime) 
RETURNS @Count TABLE 
        (
    [ID] int identity (1,1), 
    Transdate datetime, 
    Donation varchar (10), 
    DailyCount int, 
    RunningTotal int  
        ) 

AS 
BEGIN 

DECLARE @running_total TABLE (Transdate DATETIME,Donation varchar(30), countz INT,row int) 
INSERT INTO @running_total 

SELECT TransDate,Donation, COUNT(*) 
,ROW_number() OVER (PARTITION BY Donation order by TransDate ASC) as row 
FROM RevInt.DetailDonation WHERE TransDate > '@Date' GROUP BY TransDate,Donation 

SELECT 
r1.Transdate, 
r1.Donation, 
r1.countz, 
SUM(r2.countz) as running_total 
FROM @running_total r1 
LEFT OUTER JOIN @running_total r2 on r2.donation = r1.Donation 
       AND r2.row <= r1.row 
GROUP BY 
r1.transdate, 
r1.countz, 
r1.donation, 
r1.row 
ORDER BY r1.Donation 

     RETURN 
END 
+0

这看起来像一个存储过程,而不是一个函数。 – 2013-03-22 17:41:49

+0

我是新来的函数和存储过程。你能简单地向我解释为什么这应该是一个SP? – user2200270 2013-03-22 17:55:12

回答

1

正确的语法是:

CREATE FUNCTION DailyMailCount(@Date datetime) 
RETURNS @Count TABLE (
    [ID] int identity (1,1), 
    Transdate datetime, 
    Donation varchar (10), 
    DailyCount int, 
    RunningTotal int  
) 
as begin 
    DECLARE @running_total TABLE (Transdate DATETIME,Donation varchar(30), countz INT,row int) 
    INSERT INTO @running_total 
     SELECT TransDate,Donation, COUNT(*), 
       ROW_number() OVER (PARTITION BY Donation order by TransDate ASC) as row 
     FROM DetailDonation 
     WHERE TransDate > '@Date' 
     GROUP BY TransDate, Donation; 

    insert into @Count 
     SELECT r1.Transdate, r1.Donation, r1.countz, 
       SUM(r2.countz) as running_total 
     FROM @running_total r1 
      LEFT OUTER JOIN @running_total r2 
      on r2.donation = r1.Donation AND r2.row <= r1.row 
     GROUP BY r1.transdate, r1.countz, r1.donation, r1.row 
     ORDER BY r1.Donation; 

    RETURN; 
END; 

你缺少insert到返回表。

您还可以创建一个在线功能(一个语句)通过使用一个单一的查询:

return with running_total as (
    SELECT TransDate,Donation, COUNT(*), 
      ROW_number() OVER (PARTITION BY Donation order by TransDate ASC) as row 
    FROM RevInt.DetailDonation 
    WHERE TransDate > '@Date' 
    GROUP BY TransDate,Donation 
) 
SELECT r1.Transdate, r1.Donation, r1.countz, SUM(r2.countz) as running_total 
FROM running_total r1 LEFT OUTER JOIN 
    running_total r2 
    on r2.donation = r1.Donation 
       AND r2.row <= r1.row 
GROUP BY r1.transdate, r1.countz, r1.donation, r1.row 
ORDER BY r1.Donation 
+0

谢谢,我会试一试 – user2200270 2013-03-22 17:59:49

+0

我不确定我是否正在跟随你。您介意复制并粘贴我的原始代码发布并向我展示如何更改它? – user2200270 2013-03-22 18:10:39

+0

@ user2200270。 。 。我修好了它。我原来的回答只是错误的方向。 – 2013-03-22 18:18:03