首页 > 解决方案 > SQL 检索“日历”表

问题描述

我有 3 张桌子:

  1. BK_Athleten有很多列,但有 3 个有趣的列是:

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

    • IDEinheit:训练会话的索引,主键
    • 基准:会议日期
  3. BK_Anwesend有 3 列是培训课程的登记册

    • 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 作为选择 FINCode,

在枢轴子句中还有:

PIVOT

计数(IDPres)

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

更新 3

该视图现在正在工作!

CREATE VIEW dbo.view1 AS 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 (SELECT BK_Athleten.FINCode, RIGHT(BK_Einheiten.Datum, 2) AS Day, BK_Anwesend.IDPres 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) AS PVT

PIVOT
(
Count(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] )
) 作为 PRT

我现在有两个问题:

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

2)我如何添加 2 个右列与 a)会话的总和 2)出勤率取决于最后一行数据?

非常感谢。

标签: sqlsql-servertsqlcalendarsql-server-2008-r2

解决方案


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

 CREATE VIEW dbo.view1
 AS
 SELECT FINCode, 

在枢轴子句中还有:

PIVOT  
(  
Count(IDPres) 

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


推荐阅读