【问题标题】:if count value of the column is greater than 1, I want to print the count of the column else I want to print value in the field如果列的计数值大于 1,我想打印列的计数,否则我想在字段中打印值
【发布时间】:2020-03-25 14:05:35
【问题描述】:

我正在编写一个从不同表中获取详细信息的查询。在一列中,我想打印一列的计数值。如果列的计数值大于1,我想打印列的计数,否则我想在字段中打印值。

我想构建一个查询,它会给我表 1 和 2 中的 user_id 计数。如果计数 user_id 大于 1,则打印 count (user_id) 否则打印 user_id 的值

表:1

|用户 ID |
|约翰 |
|鲍勃 |

|克里斯|

|汤姆 |


表:2

|用户 ID |
|抢 |

查询结果应该列出 table1 的计数,因为它大于 1。Table2 应该列出 Rob,因为它小于 2

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • Kris 和 Tom 在不同的列吗?
  • 进行了更改,忽略 table1 中的空白
  • 你想要的输出是什么样的?
  • 查询结果应该列出table1的计数,因为它大于1。Table2应该列出Rob,因为它小于2

标签: sql sql-server


【解决方案1】:

您想从表中选择用户 ID(实际上是名称)。如果只有一行,则显示该名称,否则显示条目数。因此,只需使用 CASE 表达式来检查 count 是 1 还是大于 1。

您可能需要CASTCONVERT 将计数转换为字符串,因此CASE 表达式总是返回相同的类型(这就是CASE 的工作原理)。

select
  case when count(*) > 1 
       then cast(count(*) as varchar(100)) 
       else max(user_id)
  end as name_or_count
from mytable

【讨论】:

    【解决方案2】:

    Window Functions 浮现在脑海中,但由于您的 user_id 不是数字,您会遇到一个问题,即您不能在同一列中拥有两种不同的数据类型。看看这对你有什么作用。如果此脚本是更大进程的一部分,请确保将 varchar 数字转换回 integer

    with cte as 
    
    (select 'John' as user_id union all
     select 'Bob' as user_id union all
     select 'Kris' as user_id union all
     select 'Tom' as user_id)
    
    select distinct case when count(*) over() > 1 
                         then cast(count(*) over() as varchar) else user_id end
    from cte
    

    with cte as 
    
    (select 'Rob' as user_id)
    
    select distinct case when count(*) over() > 1 
                         then cast(count(*) over() as varchar) else user_id end
    from cte
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多