SQLServer Pivot query - PullRequest
       0

SQLServer Pivot query

0 голосов
/ 05 ноября 2010

Я работаю над приложением, в котором у меня есть следующая схема

Мастер задач

Task_ID
Task_Name

Task_Details

Task_ID
Task_Date
Task_Count (может быть любым числом, например, 2, 3, 4 или 40)

Форма ввода аналогична той, которую сотрудники будут заполнять в конце дня.

Дата |Название задачи |Task_Count

24/01/2010 |Сколько чековых книжек выпущено сегодня |12
24.01.2010 |Сколько банкоматов выпущено сегодня |7

Теперь я хочу получить матричный отчет, показывающий, что все задачи предполагают 28 задач в вертикальном ряду, и в данном месяце должны отображаться все даты определенного месяца в горизонтальном направлении, например, от 1 до 31 дня или 30 или 28 согласночисло дней с параметром task_count с использованием PIVOT в запросе.Мне не удалось получить результат, так как я не знаю, как заставить его работать.пожалуйста помогите.

спасибо

1 Ответ

0 голосов
/ 05 ноября 2010

Вам нужно будет использовать динамический запрос, поскольку столбцы, возвращаемые сводной точкой, меняются каждый месяц.

Со временем это, возможно, можно будет сделать более элегантным, но вот основная идея:

declare @StartOfMonth datetime = '11/1/2010';
declare @counter datetime = @StartOfMonth;
declare @sql varchar(MAX) = '';
declare @columnnames varchar(MAX);
declare @columnfilter varchar(MAX);
declare @fieldname varchar(12);

--First, create a string of dynamic columns, one for each day of the month.
WHILE (MONTH(@counter) = MONTH(@StartOfMonth))
BEGIN

    SET @fieldname = '[' + CONVERT(varchar(10), @counter, 101) + ']';

    --Wrap the columns in ISNULL(@,0) to avoid having null values for days without tasks.
    SET @columnnames = ISNULL(@columnnames + ',', '') + 'ISNULL(' + @fieldname + ',0) AS ' + @fieldname;

    --Also create a dynamic list of the Task_Date values to include in the pivot.
    SET @columnfilter = ISNULL(@columnfilter + ',', '') + @fieldname;


    SET @counter = DATEADD(DAY,1,@counter);
END

--Put it all together into a pivot query.
set @sql = 'SELECT Task_Name, ' + @columnnames + ' FROM (';
set @sql = @sql + 'SELECT M.Task_Name, D.Task_Date, D.Task_Count '
set @sql = @sql + 'FROM Task_Detail D JOIN Task_Master M ON D.Task_ID = M.Task_ID) as SourceTable ';
set @sql = @sql + 'PIVOT (SUM(Task_Count) FOR Task_Date IN (' + @columnfilter + ')) AS PivotTable';

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