【问题标题】:How to Have an empty row if query result couldn't find anything with one assigned value under one column?如果查询结果在一列下找不到具有一个赋值的任何内容,如何有一个空行?
【发布时间】:2016-02-08 08:55:19
【问题描述】:

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

这是我的代码:

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 

【问题讨论】:

  • 感谢编辑!
  • 您有帐号吗?

标签: sql sql-server tsql plsql database-administration


【解决方案1】:

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

如果您有一个单独的用户表,则可以使用 OUTER 联接来获取此表。你肯定有这个,并且在查询本身中没有一个巨大的 CASE WHEN 事情?

如果它仅适用于两个用户,您还可以使用简单的选择/联合结构进行 OUTER 连接,该结构提供用户 ID 和名称,但这不是很好的方法。

【讨论】:

  • 不幸的是,这两个问题都没有,我没有第一列的表格,并且我有一个巨大的 when case 第一列和最后一列的语句,我将尝试创建一个临时表来保留我的第一个最后一行并通过存储过程使用外部联接。我会让你知道结果如何。谢谢。
【解决方案2】:

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

如果您仍然喜欢选择不创建用户表,就像 Sami 建议的那样,您应该创建一个内联视图并将其 OUTER JOIN 到您的主表。类似于下面的选择语句应该这样做。

注意:我使用了我更熟悉的语法,但应该可以 在 SQL Server 中也是如此。

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

【讨论】:

    【解决方案3】:

    您实际上可以将其外部连接到一个虚拟表并执行以下操作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2015-03-16
      • 2016-12-31
      相关资源
      最近更新 更多