2016-04-14 36 views
0

Şu anda dinamik sütunlara sahip bir gridview oluşturuyorum.Pivot Tablolu Dinamik Kılavuz Görünümü

this is what I already done using pivot table

başarıyla belirli sürat tarihten başına her görev için günlük saat sorgulama bu oluşturduk. Günlüğe kaydedilen tarihler sütun olur ve görev ve günlüğe kaydedilen saatler satır olur. Hem dikey hem de yatay toplamlar. Bu kılavuz görünümünde, kaydedilen saatleri manuel olarak düzenleyebilir ve veritabanına kaydedebilirsiniz.

Şimdi sorun tasarım değişiklikleri. Yapmam gereken şey, o görev veya tarihte hala kayıtlı saat olmasa bile ilk sütundaki sütunlar ve görev için sprint süresi tarihlerini listelemektir.

Herhangi bir yardım için teşekkür ederiz. Teşekkürler. Burada

Ben doğru sorunu anlamak, sorun @query değişkeni sorgunuzdaki katılmak türü ile olan bu bölme masanın

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

Sorunuzu uygun RDBMS ile etiketleyebilir misiniz? SQL Server gibi görünüyor –

cevap

0

için saklanan bir prosedürdür

'görev_deskini', '+ @cols +', '+ @horiz_total +' olarak #numaralı # tmp_result olarak seçin (task_description, log_date, tbl_log öğesinden log_hours komutunu seçin tbl_task.task_id = tbl_task_id üzerinde trol_task_id ere tbl_log.username = '' '+ @ kullanıcı adı +' ' ve tbl_log.sprint_id = '' '+ @ sprintId +' ''

KATILIN

hiçbir görevleri varsa bu yüzden hariç tutar, özeldir tbl_log dosyasındaki kayıtlar.

olursa olsun durumda, kapsayıcı şekilde değiştirilmelidir katılmak tbl_task karşılık gelen kayıtları havng tbl_log değerleri görüntülemek için bu bir SOL DIŞ

böylece kod

'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]+''' 
gibi görünmelidir KATILIN olmalıdır

Sen

katılır burada

farklı türde güzel açıklama bağlantısıdır JOIN SOL DIŞ dış atlayabilirsiniz SQL JOIN and different types of JOINs

Umarım bu yardımcı olur.

+0

Merhaba, Cevap için teşekkürler ama ne yazık ki ne istediğimi tbl_log – Dave

+0

üzerinde kayıt olmasa bile pivot tablodaki tarihleri ​​(sprint_start_date - sprint_end_date) tarihleri ​​ve görevleri görüntülemek için başlangıç ​​ve bitiş tarihleri Maalesef koddan net değil, çalıştığınız veri yapısı nedir? –