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 |
--------------------------------------------------------------------------------------

上記のビューでは、1月、2月... 12月は月であり、その値は、テーブル(tbl_fee_rates)を使用して計算された月のそれぞれの学生の料金です

それができない場合、どうすればこれを入手できますか、代替手段はありますか?

4

2 に答える 2

2

これを実現する 1 つの方法を次に示します。

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

demo を使用した SQL Fiddle

ここにはいくつかの注意事項があります。まず、あなたのデータでは、最初の値は2013ですが、おそらく2012になるはずです。これを反映するために Fiddle が更新されました。

また、ID 4の料金は8月ではなく4 月に適用する必要があると思います。私の結果はこれを示しています。

次に、1 年間のデータを表示していますが、データには期間の概念がありません。この回答の目的のために、2013年のみ表示すると仮定しました。要件に合わせて調整する必要がある場合があります。

独自のソリューションでは、再帰的な CTE の代わりにカレンダー テーブルを使用して月を作成することを検討できます。

上記のすべての点にもかかわらず、これにより結果を生成するための 1 つのオプションが提供されるため、解決策を見つけるのに役立つことを願っています.

于 2013-07-03T13:27:56.050 に答える
0

コードの下にコピーするか、下のフィドルリンクを試してください..ありがとう..

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

SELECT * FROM
(
        t2.ID を選択します。
               t2.名前、
               t1.クラス、
               left(datename(month,t1.DATE),3)as [月],
               t1.レート
        FROM tbl_fee_rates t1 内部結合 tbl_Students t2
        ON t1.Class = t2.class
)P
ピボット
(
SUM(RATE) FOR [month] IN (1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月、12月)
)
AS PVT

以下のように結果表示..

ID 名 クラス 1 月 2 月 3 月 4 月 5 月 6 月 7 月 8 月 9 月 10 月 11 月 12 月
----------- --------------------------------------------------- ----------- --------------------------------------------------- ----------- ----------- ----------- ----------- ------ ----- ----------- ----------- ----------- ----------- - ---------- ----------- ----------- -----------
1 Alex 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 に答える