【问题标题】:SQL Query and case statement to show multiple entries by joining two tablesSQL Query 和 case 语句通过连接两个表来显示多个条目
【发布时间】:2017-08-04 11:05:08
【问题描述】:

这是两个表的示例,我想创建一个视图作为最终结果。有两个表作为视图的输入,一个具有具有位置 ID 的国家,另一个具有位置名称,我想加入它们,然后做一个案例以用单个条目替换多个计数。 任何帮助表示赞赏。

Here is the screenshot of how tables look like, Table Entity and Table Location as input tables to the view

我首先想到从实体表中获取多个位置 ID 的计数,然后创建一个 select Case 语句但没有用,这里是草稿代码。

select
    Country, count(locationid),
    case LocationName
        when Cnt > 1 then 'Mulitple offices'
        when Cnt = 0 then 'Unknown Location'
        else LocationName
    end
from 
    Entity 
group by 
    Country

更新: 我刚刚制作了一个SQLFiddle(非常方便)并实现了@Gordon 和@P.Eh 的两种解决方案,但存在一些问题。具体见下面的cmets

【问题讨论】:

  • 案例表达式,而不是语句

标签: sql select sql-server-2012


【解决方案1】:

我认为这就是你想要的:
- 当 location 表中的 location_idNULL0 时,'Unknow location'

select
    COU.Country,
    case 
        when COU.pleace is null OR COU.pleace=0 then 'Unknow location'
        when COU.number_of_pleaces > 1 then 'Multiple offices'
        else coalesce(LOC.Location_name,'cound not math location')
    end as [location name]
from
    (   select country,
            sum(1) as number_of_pleaces,
            max(Location_id) as pleace
        from @entity
        group by country
    ) COU
    left join
    @location LOC
        on LOC.Location_id = COU.pleace
        and COU.number_of_pleaces = 1

【讨论】:

  • 谢谢@P.ejH,我正在尝试这段代码,代码:'max(location_id) as Pleace throws multi-part identifier could not be found!,感谢任何帮助
  • 在 SQLFiddle 中再次测试(请参阅上面有问题的链接),特别是对于英国,它会抛出错误的多个办公室。否则工作正常。如果 location_id 为零,我们可以稍微写一下“未知位置”吗
【解决方案2】:

你似乎想要这样的东西:

select e.Country, count(l.locationId),
       (case when count(l.locationId) > 1 Then 'Mulitple offices'
             when count(l.locationId) = 0  then 'Unknown Location'
             else max(l.LocationName)
        end)
from Entity e left join
     Location l
     on e.locationId = l.locationId
group by e.Country;

【讨论】:

  • 感谢 Gordon 的回复,我认为这非常接近。该查询返回多个办公室,其中发现计数 > 2,但对于其他情况,它全部为 NULL。不知道是什么问题。任何猜测
  • 我并不担心'Case e.locationID = 0' 但为什么它没有得到最大值(l.locationName)?
  • @Abdul 。 . .也许没有一个国家只有一个位置。
  • 我尝试了修改后的代码,它会抛出全零,我猜是因为位置表实际上并没有多条记录要计算。顺便说一句,我的记录显示一个国家只有一个位置
  • 为什么我不能删除 Max(l.LocationName) 而只使用 L.locationname,所以我得到了实际值,我需要先结束每个案例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多