2016-04-14 5 views
0

В настоящее время я создаю gridview с динамическими столбцами.Dynamic Gridview with Pivot Table

this is what I already done using pivot table

Я успешно создал это из запрашивая часов журнала для каждой задачи на сегодняшний день на конкретном спринте. Записанные даты становятся столбцом, а задание и протоколируемые часы становятся строками. Как по вертикали, так и по горизонтали. В этом gridview вы можете вручную отредактировать зарегистрированные часы и сохранить их в базе данных.

Проблема теперь в изменениях дизайна. Что мне нужно сделать, так это просто указать даты продолжительности спринта для столбцов и задачи в первом столбце, даже если в этой задаче или дате не было зарегистрированного часа.

Любая помощь будет оценена по достоинству. Благодарю.

здесь хранимая процедура для этого шарнирного стола

USE [JiraAutomation] 
GO 
/****** Object: StoredProcedure [dbo].[logs] Script Date: 4/12/2016 7:00:09 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[logs] 
@username nvarchar(30), 
@sprintId nvarchar(30) 

AS 
/* COLUMNS HEADERS */ 
Declare 
@cols as NVARCHAR(MAX) 


select @cols = STUFF((SELECT ',' + QUOTENAME(log_date) 
      from tbl_log join tbl_task on tbl_task.task_id = tbl_log.task_id 
       where tbl_log.username = @username 
       and tbl_log.sprint_id = @sprintId 
      group by log_date 
      order by log_date 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

DECLARE @horiz_total nvarchar(MAX) 

SELECT @horiz_total = stuff((
      SELECT '+isnull(' + quotename(log_date) + ',0)' 
      FROM tbl_log 
      join tbl_task on tbl_task.task_id = tbl_log.task_id 
       where tbl_log.username = @username 
       and tbl_log.sprint_id = @sprintId 
      GROUP BY log_date 
      ORDER BY log_date 
     FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') 

DECLARE @vert_total nvarchar(MAX) 

SELECT @vert_total = stuff((
      SELECT ',sum(' + quotename(log_date) + ')' 
      FROM tbl_log 
      join tbl_task on tbl_task.task_id = tbl_log.task_id 
       where tbl_log.username = @username 
       and tbl_log.sprint_id = @sprintId 
      GROUP BY log_date 
      ORDER BY log_date 
      FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') 

DECLARE @isnulls nvarchar(MAX) 

SELECT @isnulls = stuff((
      SELECT ',isnull(' + quotename(log_date) + ',0) as '+quotename(log_date) 
      FROM tbl_log 
      GROUP BY log_date 
      ORDER BY log_date 
      FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') 

DECLARE @query nvarchar(MAX) 

SET @query = 'select task_description as TASK,' + @cols + ',' + @horiz_total + ' as Total 
       into #tmp_result 
       from (select task_description, log_date, log_hours from tbl_log join tbl_task on tbl_task.task_id = tbl_log.task_id 
       where tbl_log.username = '''[email protected]+''' 
       and tbl_log.sprint_id = '''[email protected]+''' 
      ) x 
       pivot (sum(log_hours) for log_date in (' + @cols + ')) p 

       select * 
       from #tmp_result 
       union all 
       SELECT '''','[email protected]_total +', 
ISNULL (SUM([Total]),0) FROM #tmp_result 
DROP TABLE #tmp_result' 
-- PRINT 'Pivot Query '[email protected] 
EXECUTE(@query) 
+0

Не могли бы вы пометить свой вопрос с помощью правильной СУБД? Похоже, SQL Server –

ответ

0

Если я правильно понял вопрос правильно, то проблема с типом присоединиться в запросе в переменной @query

'выберите task_description как TASK,' + @cols + ',' + @horiz_total + 'как Total в #tmp_result from (выберите task_description, log_date, log_hours from tbl_log join tbl_task на tbl_task.task_id = tbl_log.task_id wh прежде чем tbl_log.username = '' '+ @ имя пользователя +' '' и tbl_log.sprint_id = '' '+ @ sprintId +' ''

Соединить является эксклюзивным, так что если не существует ни одного задания она исключает записи в tbl_log.

Для отображения значений из tbl_log независимо от havng соответствующих записей в tbl_task Соединить должен быть изменен с учетом, в вашем случае это должно быть LEFT OUTER JOIN

так что код должен выглядеть

'select task_description as TASK,' + @cols + ',' + @horiz_total + ' as Total 
       into #tmp_result 
       from (select task_description, log_date, log_hours from tbl_log LEFT OUTER JOIN tbl_task on tbl_task.task_id = tbl_log.task_id 
       where tbl_log.username = '''[email protected]+''' 
       and tbl_log.sprint_id = '''[email protected]+''' 

Вы можете опустить OUTER от LEFT OUTER JOIN

здесь ссылка на хорошее объяснение различных типов объединений

SQL JOIN and different types of JOINs

Надеюсь, это поможет.

+0

Привет, спасибо за ответ, но, к сожалению, я хочу отображать даты (даты от sprint_start_date до sprint_end_date) и задачи на сводной таблице, даже если у них нет записи на tbl_log – Dave

+0

Есть ли таблица с названием tbl_sprint с даты начала и окончания? Извините, из кода не ясно, с какой структурой данных вы работаете. –