我目前正在创建一个包含动态列的gridview。
我已经通过查询特定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)
答案 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
我希望这会有所帮助。