【问题标题】:how to select particular columns in sql statement如何在sql语句中选择特定列
【发布时间】:2012-01-03 08:42:10
【问题描述】:

我需要删除两行中值为“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  

输出:


请帮我解决这个问题..

问候

T.纳文

更新:

我正在将上面的 sql 查询结果保存到 c# 中的数据集中.. 是否可以过滤在两行中都包含“0”的列..以便数据集看起来像快照中所需的输出

【问题讨论】:

  • 没有简单的方法可以做到这一点。您必须将查询的结果存储在临时表中,然后使用临时表针对它构建动态查询,仅包括所有行中不包含 0 的列。使用结果集中的动态列数,您必须动态构建查询。也许这在某些客户端代码中更容易做到?
  • @MikaelEriksson:thanx ..我会尝试动态地做到这一点..我将输出存储在 c# 的数据集中,是否可以像在数据集中所需的输出一样过滤数据集中的列快照
  • 我没有足够的 C# 知识来回答这个问题。我确信有一些方法可以在演示文稿中隐藏列。如果最好在数据集或某些 GUI 组件中完成,我不知道。

标签: c# sql sql-server sql-server-2005 dataset


【解决方案1】:

这可能最好留给 SQL Server Reporting Services、Crystal Reports 等报告工具来完成。但是,如果需要完成并且您没有使用报告工具,那么至少是可能的。

在 C# 方面,您可以通过循环浏览 DataTable 的 Columns 集合来从 DataSet 中的基础 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

附:您的 GROUP BY 子句似乎存在问题,因为我希望其中需要 [Machine] 字段。

【讨论】:

  • thanx..我今天休息,明天我会检查这个查询,我会让你知道结果:) ..
【解决方案2】:

我已经过滤了列中包含“0”的数据集.. 我参考这个网站,以获得输出

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多