SQL检索“日历”表

时间:2018-08-29 13:23:01

标签: sql sql-server tsql calendar sql-server-2008-r2

我有3张桌子:

  1. BK_Athleten包含许多列,但3个有趣的列是:

    • FINCode:运动员的注册号,主键
    • 名称
    • 姓氏
  2. BK_Einheiten包含许多列,但有趣的2列是:

    • IDEinheit:培训课程的索引,主键
    • 基准:会议日期
  3. BK_Anwesend(三列)是培训课程的记录

    • IDPres:只是一个索引
    • FINCode:是运动员的注册号码
    • IDEinheit:是培训课程的进步指数

如何获取每月培训出勤表?将月份传递给我想要的功能 检索一个表格,其运动员姓名在左侧,所有月日在顶部,在交叉点计数 每位运动员每天的出席次数(即使该表格中包含0次会话的天数也应显示在表格中)。

是否可以做到这一点而无需每天每名运动员每天进行标量查询?

更新

非常感谢您的建议!我正在使用SQL Server 2008 R2。

经过数小时的尝试,我陷入了以下错误:

  

列前缀“ BK_Anwesend”与查询中使用的表名或别名不匹配。   多部分标识符“ BK_Athleten.FINCode”无法绑定。

这是我的代码:

CREATE VIEW dbo.view1
AS
SELECT BK_Athleten.FINCode,   
 [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16],
  [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]   
FROM  

(SELECT        BK_Athleten.FINCode, RIGHT(BK_Einheiten.Datum, 2) AS Day
FROM            BK_Anwesend INNER JOIN
                         BK_Athleten ON BK_Anwesend.FINCode = BK_Athleten.FINCode INNER JOIN
                         BK_Einheiten ON BK_Anwesend.IDEinheit = BK_Einheiten.IDEinheit
GROUP BY BK_Athleten.FINCode, BK_Einheiten.Datum) AS SourceTable

PIVOT  
(  
Count(BK_Anwesend.IDPres) 
FOR Day IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], 
[16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31] )  
) AS PivotTable;

更新2

CBS修正后

创建视图dbo.view1  如  SELECT FINCode,

以及在数据透视子句中:

PIVOT

Count(IDPres)

现在错误是“无效的列名'IDPres'”。尝试了所有更改,但没有成功。

更新3

该视图现在正在工作!

创建视图dbo.view1 如 SELECT FINCode,[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] ,[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[ 25],[26],[27],[28],[29],[30],[31]
FROM(选择BK_Athleten.FINCode,RIGHT(BK_Einheiten.Datum,2)AS Day,BK_Anwesend.IDPres 来自BK_Anwesend内部联接                          BK_Athleten ON BK_Anwesend.FINCode = BK_Athleten.FINCode INNER JOIN                          BK_Einheiten ON BK_Anwesend.IDEinheit = BK_Einheiten.IDEinheit)AS PVT

PIVOT

计数(IDPres) FOR Day IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12 ],[13],[14],[15], [16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28] ],[29],[30],[31])
)AS PRT

我现在有2个问题:

1)如何根据月中的天数使查询动态化?

2)如何在右边添加2列,其中a)会话总数之和2)出席率取决于最后一行数据?

非常感谢。

1 个答案:

答案 0 :(得分:0)

从最终选择查询中删除表名称。

 CREATE VIEW dbo.view1
 AS
 SELECT FINCode, 

以及在数据透视子句中:

PIVOT  
(  
Count(IDPres) 

这应该可以解决您的错误。