SQL来查找不同的多个值

SQL来查找不同的多个值,sql,sql-server-2008,Sql,Sql Server 2008,我有一个表,其中包含房间信息,其中包括一列BLDGCODE和另一列COSTCODE。建筑BLDGCODE中的每个房间只能指定一个costcode,这些costcode可以是相同的值,也可以是不同的值 我试图写一个脚本,只显示分配给多个房间的多个不同成本代码的建筑,例如,几个房间可能有成本代码ABC和其他999,这是我想要确定和报告的。我曾尝试过以下想法,认为CTE会让我得到结果,但我仍然看到建筑物中只有一个成本代码,在建筑物中的多个房间重复 with CTE as ( select rt

我有一个表,其中包含房间信息,其中包括一列BLDGCODE和另一列COSTCODE。建筑BLDGCODE中的每个房间只能指定一个costcode,这些costcode可以是相同的值,也可以是不同的值

我试图写一个脚本,只显示分配给多个房间的多个不同成本代码的建筑,例如,几个房间可能有成本代码ABC和其他999,这是我想要确定和报告的。我曾尝试过以下想法,认为CTE会让我得到结果,但我仍然看到建筑物中只有一个成本代码,在建筑物中的多个房间重复

with CTE
as (
    select rtrim(fmb0.reg_code) as Region,
        rtrim(Country) as Country,
        rtrim(fmb0.BLDGCODE) as BLDGCODE,
        (
            case 
                when FMB0.BLDGSTATUS = 'CAD'
                    then 'Yes'
                else 'No'
                end
            ) as CAD,
        group_ as GROUP_,
        fma0.usable,
        fmb0.nia,
        fmb0.niahprev
    from fmb0
    left join fma0 on fmb0.bldgcode = fma0.bldgcode
    left join fmey on fmb0.propsubtyp = fmey.ey_key
    left join fme2 on fmb0.country = fme2.descrip
    where fme2.is_live = 1
        and fmey.bau = 1
        and fmb0.bldgcode not like 'xx%'
        and fma0.bldgcode like 'cn%'
    )
select CTE.Region,
    CTE.Country,
    CTE.BLDGCODE,
    CTE.GROUP_,
    sum(cte.usable) as AREA,
    cte.nia,
    cte.niahprev,
    CTE.CAD
from CTE
where CTE.CAD = 'No'
group by CTE.BLDGCODE,
    cte.group_,
    cte.country,
    cte.region,
    cte.nia,
    cte.cad,
    cte.niahprev
having count(CTE.GROUP_) > 1
order by 1, 2, 3
我如何移除那些尽管有多处建筑物,但成本代码相同的建筑物,并且只显示那些有多个不同成本代码的建筑物

下面是引用单个表的代码:

with CTE as (
select 
rtrim(fma0.BLDGCODE) as BLDGCODE, 
group_ as GROUP_,
fma0.usable
from fma0
where 
fma0.bldgcode like 'cn%'
)
select 
CTE.BLDGCODE,
CTE.GROUP_ AS COSTCODE,
sum(cte.usable) as AREA
from CTE
group by CTE.BLDGCODE, cte.group_
having count(CTE.GROUP_) > 1
order by 1
示例数据集为:

RMID      BLDGCODE    COSTCODE    AREA
01.01     01          AA-01       10
01.02     01          AS-05       20
01.03     01          XY-99       30
01.04     01          XY-99       70
02.01     02          AA-01       10
02.02     02          AA-01       20
02.03     02          AA-01       20
BLDGCODE     COSTCODE     AREA
01           AA-01        10
01           AS-05        20
01           XY-99        100
预期结果将是:

RMID      BLDGCODE    COSTCODE    AREA
01.01     01          AA-01       10
01.02     01          AS-05       20
01.03     01          XY-99       30
01.04     01          XY-99       70
02.01     02          AA-01       10
02.02     02          AA-01       20
02.03     02          AA-01       20
BLDGCODE     COSTCODE     AREA
01           AA-01        10
01           AS-05        20
01           XY-99        100
BLDGCODE 02不会显示,因为它只有一个成本代码


谢谢

您希望所有这些行都包含多个成本代码,因此简单的聚合不起作用。您可以使用另一个带窗口聚合的cte执行相同的逻辑:

with CTE as (
select 
   rtrim(fma0.BLDGCODE) as BLDGCODE, 
   group_ as GROUP_,
   fma0.usable
from fma0
where fma0.bldgcode like 'cn%'
)
,counts as
 (
   select 
      CTE.BLDGCODE,
      CTE.GROUP_ AS COSTCODE,
      sum(cte.usable) as AREA,
      case when min(CTE.GROUP_) over (partition by CTE.BLDGCODE) 
             <> max(CTE.GROUP_) over (partition by CTE.BLDGCODE)
           then 1
           else 0
      end as flag
   from CTE
   group by CTE.BLDGCODE, cte.group_
 ) 
select *
from counts
where flag = 1

关于表的语句似乎与涉及多个表的查询无关。示例数据和所需结果将有助于澄清问题。请尝试使用MINcostcode MAXcostcode至少两个不同的成本代码,这比使用COUNTDISTINCT costcode>1 Hanks dnoeth更有效,但这两个示例都返回零值,COUNTDISTINCT CTE.GROUP>1 Hanks Josh,Hanks dnoeth的结果为零,但我似乎无法实现这一点,你介意将我的简化SQL包含在上面并嵌入到你的答案中吗?@FredTheDog:编辑了我的答案,现在应该可以了。工作起来很有魅力,我需要更好地理解如何嵌套CTE语句。