0

我有 2 个表用于学费管理项目
学生表,其中包含学生姓名班级和其他字段
,并且 tbl_fee_rates 是根据每月费率保留有关班级费用信息的表,应使用 tbl_fee_rates 表计算费率

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_fee_rates)计算

如果它不可能通过,我怎么能得到这个,有什么选择吗?

4

2 回答 2

2

这是实现此目的的一种方法:

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

SQL Fiddle 与演示

这里有许多警告。首先,使用您的数据,第一个值是2013但可能应该是2012;Fiddle 已更新以反映这一点。

另外,我假设ID为 4的费率应该在April而不是August应用;我的结果表明了这一点。

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

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

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

于 2013-07-03T13:27:56.050 回答
0

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

http://sqlfiddle.com/#!3/72364/3/0

选择 * 从
(
        选择 t2.ID,
               t2.姓名,
               t1.类,
               left(datename(month,t1.DATE),3)as [month],
               t1.RATE
        FROM tbl_fee_rates t1 内连接 tbl_Students t2
        ON t1.Class = t2.class
) P
枢
(
SUM(RATE) FOR [month] IN(一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月)
)
作为 PVT

结果显示如下..

ID 名称 类别 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
------------ --------------------------------------- ------------ --------------------------------------- ----------- ------------ ----------- ----------- ------ ----- ----------- ----------- ----------- ----------- - ---------- ------------ ----------- ------------
1 亚历克斯 5TH NULL NULL 350 NULL 300 NULL NULL NULL NULL NULL NULL 200
2 亚历克斯 6TH NULL NULL NULL 600 320 NULL NULL NULL NULL NULL NULL 500

(2 行受影响)


于 2013-07-03T14:04:46.480 回答