Sql server sql server Ceate视图(根据需要)

Sql server sql server Ceate视图(根据需要),sql-server,stored-procedures,view,Sql Server,Stored Procedures,View,我有两张表格用于学费管理项目 学生表,其中包含学生姓名、班级和其他字段 tbl_费用率是根据费率保存有关课程费用信息的表格 每月费率应使用tbl_费率表计算 tbl_fee_rates ------------------------------------- id date class rate | ------------------------------------- 1 31-12-2013 5th 200 | 2 3

我有两张表格用于学费管理项目 学生表,其中包含学生姓名、班级和其他字段 tbl_费用率是根据费率保存有关课程费用信息的表格 每月费率应使用tbl_费率表计算

tbl_fee_rates
-------------------------------------
id    date       class    rate      |
-------------------------------------
1   31-12-2013    5th     200       |
2   31-12-2013    6th     500       |
                                    |
3   27-03-2013    5th     250       |
4   01-04-2013    6th     600       |
                                    |
5   29-05-2013    5th     300       |
                                    |
6   29-09-2013    5th     320       |
-------------------------------------
另一张桌子是

tbl_Students
-----------------------
ID     Name     Class |
-----------------------
1      Alex      5th  |
1      Alex      6th  |
-----------------------
我需要一个如下视图

tbl_Students
--------------------------------------------------------------------------------------
ID     Name     Class  JAN   FEB   MAR   APR  MAY  JUN  JUL  AUG  SEP  OCT  NOV  DEC |
--------------------------------------------------------------------------------------
1      Alex      5th   200   200   200   250  250  300  300  300  300  320  320  320 |
1      Alex      6th   500   500   500   500  500  500  500  600  600  600  600  600 |
--------------------------------------------------------------------------------------
在上面的视图中,一月、二月、十二月是月份,其值是各自学生的费用 一个月的费用使用表TBL\u费率计算


如果无法通过,我如何获得此功能,还有其他选择吗?

以下是实现此功能的一种方法:

create view Rates2013 as

with months as
(
  select monthStart = cast('01-jan-2013' as date)
  union all
  select monthStart = dateadd(month, 1, monthStart)
  from months
  where dateadd(month, 1, monthStart) < '01-jan-2014'
)
, rates as
(
  select s.ID
    , s.Name
    , s.Class
    , rateMonth = left(datename(month, m.monthStart), 3)
    , r.rate
  from months m
    cross join tbl_Students s
    cross apply (select top 1 rate
      from tbl_fee_rates r
      where m.monthStart >= r.[date]
        and s.Class = r.class
      order by [date] desc) r
)
select ID, Name, Class, [Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec]
from rates
pivot
(
  sum(rate)
  for rateMonth in ([Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])
) p

这里有一些警告。首先,根据您的数据,第一个值是2013年,但可能是2012年;小提琴已经更新以反映这一点

此外,我假设ID为4的利率应该在4月份应用,而不是8月份;我的结果显示了这一点

接下来,您将显示一年的数据,但数据中没有时间段的概念。就本回答而言,我假设仅显示2013年的数据;您可能需要根据您的要求进行定制

对于您自己的解决方案,可以考虑使用日历表创建月份而不是递归CTE。< /P>


尽管有上述所有要点,但这确实提供了一个生成结果的选项,因此希望它能帮助您找到解决方案。

非常简单,只需复制即可。。下面的代码或尝试下面的小提琴链接。。谢谢

结果显示如下

ID Name CLASS jan feb mar apr may jun jul aug sep oct nov dec ----------- -------------------------------------------------- -------------------------------------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 1 Alex 5TH NULL NULL 350 NULL 300 NULL NULL NULL NULL NULL NULL 200 2 Alex 6TH NULL NULL NULL 600 320 NULL NULL NULL NULL NULL NULL 500 (2 row(s) affected) 你试过旋转吗? ID Name CLASS jan feb mar apr may jun jul aug sep oct nov dec ----------- -------------------------------------------------- -------------------------------------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 1 Alex 5TH NULL NULL 350 NULL 300 NULL NULL NULL NULL NULL NULL 200 2 Alex 6TH NULL NULL NULL 600 320 NULL NULL NULL NULL NULL NULL 500 (2 row(s) affected)