动态网格视图与数据透视表

时间:2016-04-14 06:09:31

标签: sql-server pivot pivot-table

我目前正在创建一个包含动态列的gridview。

this is what I already done using pivot table

我已经通过查询特定sprint上每个日期的每个任务的日志时间来成功创建了这个。记录的日期将成为列,任务和记录的小时数将成为行。具有垂直和水平总计。 在此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 = '''+@username+'''
              and tbl_log.sprint_id = '''+@sprintId+'''
              ) x
              pivot (sum(log_hours) for log_date in (' + @cols + ')) p

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

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么问题在于@query变量中查询中的连接类型

  

'选择task_description为TASK,'+ @cols +','+ @horiz_total +'为总计                 进入#tmp_result                 from(选择task_description,log_date,log_hours来自tbl_log join tbl_task on tbl_task.task_id = tbl_log.task_id                 其中tbl_log.username ='''+ @ username +'''                 和tbl_log.sprint_id ='''+ @ sprintId +'''

JOIN是独占的,所以如果没有任务,它将排除tbl_log中的记录。

要显示tbl_log中的值而不管tbl_task中的havng对应记录,连接应更改为包含,在您的情况下,这应该是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 = '''+@username+'''
              and tbl_log.sprint_id = '''+@sprintId+'''

您可以省略LEFT OUTER JOIN的OUTER

这里有一个链接,可以很好地解释不同类型的连接

SQL JOIN and different types of JOINs

我希望这会有所帮助。