【问题标题】:Dynamic Gridview with Pivot Table带有数据透视表的动态 Gridview
【发布时间】:2016-04-14 06:09:30
【问题描述】:

我目前正在创建一个具有动态列的网格视图。

我已通过查询特定 sprint 中每个日期的每个任务的日志小时数成功地创建了这个。记录的日期成为列,任务和记录的小时数成为行。具有垂直和水平总计。 在此 gridview 上,您可以手动编辑记录的小时数,并将其保存到数据库中。

现在的问题是设计更改。 我需要做的只是在第一列列出列和任务的 sprint 持续时间日期,即使该任务或日期仍然没有记录的小时数。

任何帮助将不胜感激。谢谢。

这是这个透视表的存储过程

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)

【问题讨论】:

  • 你能用适当的 RDBMS 标记你的问题吗?看起来像 SQL Server

标签: sql-server pivot pivot-table


【解决方案1】:

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

'选择task_description作为TASK,'+@cols +','+@horiz_total +'作为Total 进入#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 其中 tbl_log.username = '''+@username+''' 和 tbl_log.sprint_id = '''+@sprintId+'''

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

要显示 tbl_log 中的值,而不管 tbl_task 中是否有相应的记录,连接应更改为包含,在您的情况下,这应该是左外连接

所以代码应该看起来像

'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

我希望这会有所帮助。

【讨论】:

  • 嗨,感谢您的回答,但不幸的是,我想要在数据透视表上显示日期(从 sprint_start_date 到 sprint_end_date 的日期)和任务,即使它们在 tbl_log 上没有记录
  • 是否有一个名为 tbl_sprint 的表格,其中包含开始日期和结束日期?抱歉,从代码中不清楚,您正在使用的数据结构是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2010-12-28
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多