WITH DayTable AS (SELECT CAST(@StartDate AS DATETIME) theDate, DATENAME(dw,@StartDate) theDayOfWeek UNION ALL SELECT DATEADD(dd,1, theDate), DATENAME(dw,DATEADD(dd,1, theDate)) FROM DayTable s WHERE DATEADD(dd,1, theDate)<= CAST(@EndDate AS DATETIME))
INSERT INTO @DayTable(theDate, theDayOfWeek) SELECT theDate, theDayOfWeek FROM DayTable OPTION (MAXRECURSION 365);
,Convert(decimal(10,2),TotalBillableFees/IIF(DATEDIFF(MONTH,StartDate,EndDate)=0,1,DATEDIFF(MONTH,StartDate,EndDate))) AS BillableFeesPerMonths,EndDate
,[Date]= CONVERT(DATETIME,EOMONTH(StartDate))
FROM #ProductSales
UNION ALL SELECT ProjectiD,BillableFeesPerMonths,EndDate,
11条答案
按热度按时间qcuzuvrc1#
易用sql 2005+;如果你有一个数字或计数表就容易了。我在下面伪造了它:
如果您有一个tally表,请用该表替换子查询。没有递归。
vfh0ocws2#
如果您使用的是sql server 2005或更新版本,请尝试以下操作:
一个很好的例子酷的东西,你可以做一个cte。
disbfnqx3#
--声明
--查询:
--输出
xqnpmsa84#
这是一个不需要递归的解决方案,同时,这个表值函数可以在许多查询中重用,而无需再次重复样板变量的声明。对于那些不希望递归的人来说,这是唯一的选择。
创建以下简单函数:
然后选择:
lnlaulya5#
我知道这是一个旧的线程,但我不得不承认我的沮丧,在这里给出的递归和循环解决方案过多。我想知道有多少人意识到递归只不过是一个非常昂贵的循环?我理解创建表值函数的愿望,但我建议以下方法更有效,因为它是基于集合的,没有循环、递归或重复的单insert语句:
7uzetpgm6#
使用mvj的f_table_date函数,它非常棒:
http://www.sqlteam.com/forums/topic.asp?topic_id=61519
一旦你实现了这一点,只需传入开始和结束日期,你就可以插入所有的日期之间。
w8rqjzmb7#
使用@abe miesler的答案,为了其他人的方便,我将它构建到一个tvf中,用于sqlserver2008以后的版本。它可能会帮助其他人-我必须找到一种方法,包括在tvf的cte!
b09cbbtk8#
这是一个旧的线程,但如果它对任何人都有帮助,这就是我在支持cte的sqlserver的现代版本中使用的。这还提供了一周中的某一天,可以对其进行调整,以提供可能需要的其他值(即季度、月份等)。
ybzsozfc9#
bz4sfanl10#
如果因为某种原因你不能
declare
变量,例如在looker中使用派生表时,可以如下所示:顺便说一句,在lookerml中,日期序列视图可能是这样的:
arknldoa11#