如果查询结果在一列下找不到具有一个赋值的任何内容,如何有一个空行?

How to Have an empty row if query result couldn't find anything with one assigned value under one column?

我正在尝试创建一个视图,为我提供总使用量、总金额和客户的昵称。如果未找到任何内容,它将保留其他列为空,但会显示客户名称和昵称。为了方便起见,我简化了查询并更改了 table 名称和列。任何帮助将不胜感激。提前致谢。

这是我的代码:

select 
                 Client_Name= (case
                             when account = 123 then 'John'
                             when account = 234 then 'Doe'
                             end),
                  Total_Usage = sum(Credit_Used),
                  Total_Amount = sum(debit),
                  Nickname = (case 
                              when account = 123 then 'J'
                              when account = 234 then  'D'
                              end)
  from           myTable
  where          year= 2015
  group by =     (case
                 when account = 123 then 'John'
                 when account = 234 then 'Doe'
                 end),
                 (case 
               when account = 123 then 'J'
               when account = 234 then  'D'
               end)

我得到这样的答案:

John 34  3 J

我想要这样的东西:

John 34  3 J
 Doe   0  0 D 

由于数据库中没有相应的行,因此您不能这样做。

如果您有单独的 table 用户,您可以使用 OUTER 联接来获取它。当然你有那个并且在查询本身中没有一个巨大的 CASE WHEN 东西?

如果仅供两个用户使用,您还可以使用一个简单的 select/union 结构进行外部连接,该结构提供用户 ID 和名称,但这不是很好的方法。

因为您没有 table 用户,并且您有一个巨大的 case/when 表达式...您真的应该创建用户 table!正确维护 2 个大 when/case 表达式将是一场噩梦!

如果您仍然希望选择退出创建用户 table,就像 Sami 建议的那样,您应该创建一个内联视图并将其外部连接到您的主视图 table。 Select 类似于下面的语句应该可以做到。

NB: I've used syntax that is more familiar to me, but that should work in SQL Server as well.

select b.client_name,
       sum(a.credit_used) total_usage,
       sum(a.debit) total_amount,
       b.nickname
  from MyTable a
       right outer join
       (select 123 account_id, 'John' client_name, 'J' nickname union all
        select 234, 'Doe','D') b
       on
       (a.account = b.account_id)
 where a.year = 2015
 group by b.client_name, b.nickname

您实际上可以将其外部连接到虚拟 table 并执行:

when account = 234 or account is null then 'Doe'

然后对所有条目执行此操作,只需对其进行外部连接,因为无论如何您都在对名称进行硬编码...