Вероятно, это то, что лучше оставить инструменту отчетности, такому как SQL Server Reporting Services, Crystal Reports и т. Д. Однако, если это нужно сделать, и вы не используете инструмент отчетности, то это по крайней мере возможно.
На стороне C # вы можете удалить столбцы из базового DataTable в DataSet, циклически просматривая коллекцию Columns DataTable.Для этого потребуется просмотреть обе строки для каждого поля (или использовать запрос Linq), а затем удалить столбец.Я не пробовал это, поэтому я не уверен в его эффективности или в том, насколько легко / сложно это будет.Вы можете найти более подробную информацию о структуре DataTable здесь:
http://msdn.microsoft.com/en-us/library/system.data.datatable.columns.aspx
Если у вас есть возможность вызова хранимой процедуры, вы можете выполнить многошаговую операцию, предложенную @Mikael впервый комментарий к вопросу.Вот как я мог бы подойти к этому со стороны T-SQL:
CREATE TABLE #TempResults ([Date] VARCHAR(30), Machine VARCHAR(50),
[A] INT, [B] INT, [C] INT, [D] INT, [E] INT, [F] INT, [G] INT,
[OTHERS] INT)
INSERT INTO #TempResults ([Date], Machine, A, B, C, D, E, F, G, OTHERS)
SELECT DateString AS [Date],
machine,
SUM(CASE WHEN vfrm.job_id = '105' THEN (total_hours) ELSE '0' END) AS [A],
SUM(CASE WHEN vfrm.job_id = '100' THEN (total_hours) ELSE '0' END) AS [B],
SUM(CASE WHEN vfrm.job_id = '101' THEN (total_hours) ELSE '0' END) AS [C],
SUM(CASE WHEN vfrm.job_id = '102' THEN (total_hours) ELSE '0' END) AS [D],
SUM(CASE WHEN vfrm.job_id = '103' THEN (total_hours) ELSE '0' END) AS [E],
SUM(CASE WHEN vfrm.job_id = '134' THEN (total_hours) ELSE '0' END) AS [F],
SUM(CASE WHEN vfrm.job_id = '135' THEN (total_hours) ELSE '0' END) AS [G],
SUM(CASE WHEN vfrm.job_id = '9995' THEN (total_hours) ELSE '0' END) AS [OTHERS]
FROM ven_fullreportmaster vfrm
INNER JOIN ven_descriptionmaster vdm
ON vdm.description_id = vfrm.description_id
INNER JOIN ven_machinemaster vm
ON vm.machine_id = vfrm.machine_id
INNER JOIN ven_jobcodemaster vjm
ON vjm.job_id = vfrm.job_id
INNER JOIN Dim_Time dt
ON dt.Date_Id = vfrm.date_id
WHERE vfrm.entry_date = '20111208'
AND vfrm.shift_id = 2
AND vfrm.description_id IN (1, 3, 5)
AND vfrm.job_id NOT IN (9999, 9998, 9996, 9994)
AND vjm.job_status = 'ACTIVE'
GROUP BY description_name, DateString
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT [Date], Machine, '
IF (EXISTS (SELECT * FROM #TempResults WHERE [A] > 0))
BEGIN
SET @SQL = @SQL + N'[A], '
END
IF (EXISTS (SELECT * FROM #TempResults WHERE [B] > 0))
BEGIN
SET @SQL = @SQL + N'[B], '
END
IF (EXISTS (SELECT * FROM #TempResults WHERE [C] > 0))
BEGIN
SET @SQL = @SQL + N'[C], '
END
IF (EXISTS (SELECT * FROM #TempResults WHERE [D] > 0))
BEGIN
SET @SQL = @SQL + N'[D], '
END
IF (EXISTS (SELECT * FROM #TempResults WHERE [E] > 0))
BEGIN
SET @SQL = @SQL + N'[E], '
END
IF (EXISTS (SELECT * FROM #TempResults WHERE [F] > 0))
BEGIN
SET @SQL = @SQL + N'[F], '
END
IF (EXISTS (SELECT * FROM #TempResults WHERE [G] > 0))
BEGIN
SET @SQL = @SQL + N'[G], '
END
SET @SQL = @SQL + N'[OTHERS] FROM #TempResults'
EXEC (@SQL)
GO
PS Кажется, есть проблема с вашим предложением GROUP BY, так как я ожидаю, что в нем будет необходимо поле [Machine].