SQL извлекает «календарную» таблицу - PullRequest
0 голосов
/ 29 августа 2018

У меня есть 3 таблицы:

  1. BK_Athleten со многими столбцами, но есть три интересных:

    • FINCode: регистрационный номер спортсмена, первичный ключ
    • Имя
    • Фамилия
  2. BK_Einheiten со многими столбцами, но интересными являются 2:

    • IDEinheit: индекс тренировки, первичный ключ
    • Datum: дата сеанса
  3. BK_Anwesend с 3 колонками, которые являются регистром тренировочных сессий

    • IDPres: просто индекс
    • FINCode: регистрационный номер спортсмена
    • IDEinheit: прогрессивный индекс тренировок

Как я могу получить таблицу посещаемости за месяц? Проходя месяц к функции я бы хотел получить таблицу с именем спортсмена слева и всеми днями месяца вверху и на пересечении подсчета посещенных сессий для каждого спортсмена и в день (даже дни с 0 сессиями должны отображаться в таблице).

Возможно ли достичь этого без скалярных запросов к базе данных для каждого дня и спортсмена?

UPDATE

Большое спасибо за предложения! Я использую 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

CREATE VIEW dbo.view1 КАК ВЫБЕРИТЕ FINCode,

, а также в главном предложении:

PIVOT
(
Количество (IDPres)

теперь ошибка «Недопустимое имя столбца IDPres». Пробовал все изменения, но безуспешно.

ОБНОВЛЕНИЕ 3

Вид теперь работает!

СОЗДАТЬ ВИД dbo.view1 КАК ВЫБЕРИТЕ 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 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

У меня сейчас 2 вопроса:

1) Как сделать запрос динамическим в зависимости от количества дней в месяце?

2) Как я могу добавить 2 правильных столбца с: а) суммой сеансов 2) процентом посещаемости в зависимости от последней строки данных?

Большое спасибо.

1 Ответ

0 голосов
/ 30 августа 2018

Удалить имя таблицы из окончательного запроса выбора.

 CREATE VIEW dbo.view1
 AS
 SELECT FINCode, 

, а также в главном предложении:

PIVOT  
(  
Count(IDPres) 

Это должно исправить вашу ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...