我正在创建一个报告生成器,它允许我通过选择保存在数据库中的表和字段来构建自定义报告。每个表,字段,计算值等被视为单独的实体,与任何其他实体没有直接连接。它们都是独立的。
我有许多计数字段/列,我目前正在使用,使用类似于以下的代码:
sum(case when usasf_teams.division_levelid=7 then 1 else 0 end) as Dance
我的问题是这些列中有很多列,而且大多数值都是零。这使得很难发现非零值,这是我们想要看到的。
我知道我可以使用IF语句返回数字或空格,但我不想让服务器完成对每行中每列执行相同操作两次的工作。我想做这样的事情:
if(sum(case when usasf_teams.division_levelid=7 then 1 else 0 end),
{{use the comparison value}}, ' ') as Dance
这样,sum / case操作只对每个字段执行一次。
这可能吗?
答案 0 :(得分:1)
首先,您可以将逻辑简化为:
sum(usasf_teams.division_levelid = 7) as Dance
然后,我建议将0
值更改为NULL
而不是空格:
nullif(sum(usasf_teams.division_levelid = 7), 0) as Dance
如果要返回真实空间,则需要注意类型。你可以这样做;
select (case when sum(usasf_teams.division_levelid = 7) > 0
then cast(sum(usasf_teams.division_levelid = 7) as char)
else ' '
end)
您无需担心两次sum()
。聚合中的费用是操纵数据,而不是(通常)计算聚合函数本身。