Как выбрать определенные столбцы в SQL-выражении - PullRequest
0 голосов
/ 03 января 2012

Мне нужно удалить столбцы со значением '0' в обеих строках.

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  

Вывод:

enter image description here
, пожалуйста, помогите мне решить эту проблему..

С уважением

T.Navin

обновлено:

Я сохраняю приведенный выше результат запроса sql в набор данных в c # .. возможно ли этоотфильтровать столбцы, содержащие «0» в обеих строках, чтобы набор данных выглядел как требуемый вывод в снимке

Ответы [ 2 ]

0 голосов
/ 06 января 2012

я отфильтровал свой набор данных, в столбцах которого указано «0». я проверяю этот сайт, чтобы получить вывод

http://geekswithblogs.net/dotNETvinz/archive/2009/08/11/removing-columns-in-datatable.aspx

0 голосов
/ 03 января 2012

Вероятно, это то, что лучше оставить инструменту отчетности, такому как 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].

...