如何创建摘要列?

时间:2011-05-03 07:13:19

标签: sql-server tsql

这是我当前的SQL代码,

  select   
   coalesce(cast(machinename as varchar(28)), 'Grand Total:') as 'machinename', 
  (IsNull(cast(CRATE_SMALL / 60 as varchar(24)),'0') + ':' +  IsNull(cast(CRATE_SMALL % 60 as varchar(24)),'0') ) as '1001' ,
  (IsNull(cast(CRATE_MEDIUM / 60 as varchar(24)),'0') + ':' +  IsNull(cast(CRATE_MEDIUM % 60 as varchar(24)),'0'))as '1002',   
  (IsNull(cast(NO_SCHEDULE / 60 as varchar(24)),'0') + ':' +  IsNull(cast(NO_SCHEDULE % 60 as varchar(24)),'0'))   as '9999' 
     from    ( 
    select  machinename  ,   
    sum(case when vfrm.job_id = '1001' then DateDiff(mi, 0, total_time)  end) as  CRATE_SMALL ,       
    sum(case when vfrm.job_id = '1002' then DateDiff(mi, 0, total_time)  end) as  CRATE_MEDIUM ,       
     sum(case when vfrm.job_id = '9999' then DateDiff(mi, 0, total_time)  end) as  NO_SCHEDULE
    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
                      where  vfrm.entry_date = convert(varchar, getdate()-7, 105)  
                      and  vfrm.shift_id =1 
                      and vfrm.is_task_completed ='Y' 
    group by   machinename  with rollup
        ) as SubQueryALias 

输出:

 machinename    1001    1002        9999

  ARISTECH    0:0      0:0        10:0

  FADAL    0:0     5:0        10:0

  Grand Total:  0:0   5:0   20:0

问题:

无论如何都只显示总数大于零的列... 所以,在上面的例子中,我不想显示列名'1001'。

4 个答案:

答案 0 :(得分:2)

老实说,你不应该。这是一个显示问题,因此在显示数据时应该处理,而不是从数据库中检索它。

报告和数据网格等通常具有完成此功能的功能。也许提供有关您如何显示数据的更多信息,以及某人可能能够提供更多信息。

答案 1 :(得分:1)

要添加总计行,您应该查看ROLLUP子句的GROUP BY部分。这可以产生小计和总计,取决于您的最终要求。

对于隐藏列,tsql中没有解决方案 - SELECT语句总是生成具有相同形状(列的名称和类型)的结果集。

但是报告工具可以更好地服务于两者,如果这是数据的来源(考虑到查询的性质,我期望它)。报告工具往往具有更好的后处理设施。

答案 2 :(得分:0)

试试这个:

select
    entry_date,  machinename, [1001], [1002], [9999], [1001]+[1002]+[9999] as Total
    FROM ( --your query here

         ) d
    WHERE [1001]+[1002]+[9999]>0

答案 3 :(得分:0)

如何使用临时表来存储数据查询,然后从临时表中构建输出数据?

只是

1. {您的选择查询}进入#t {您从哪里查询}

2.从#t中选择entry_date,machinename,[1001],[1002],[9999] union选择''作为entry_date,'total',sum([1001]),sum([1002]),sum([9999])来自#t

这些步骤的逻辑更清晰,但是,您也可以使用类似的子查询来获得相同的结果