【发布时间】: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