这是我当前的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'。
答案 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
这些步骤的逻辑更清晰,但是,您也可以使用类似的子查询来获得相同的结果