簡體   English   中英

SQL查找不同的多個值

[英]SQL to find distinct multiple values

我有一個保存房間信息的表,除其他外,其中包含BLDGCODE列和COSTCODE列。 建築物中的每個房間(BLDGCODE)只能分配一個成本代碼,並且這些成本代碼可以全部相同或不同。

我正在嘗試編寫一個腳本,該腳本僅顯示為多個房間分配了多個不同成本代碼的建築物,例如,多個房間可能具有成本代碼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

BLDGCODE 02將不會顯示,因為它只有一個成本代碼

謝謝

你希望所有那些擁有多個costcodes行,因此一個簡單的聚集不起作用。 你可以做的另一種利用熱膨脹系數相同的邏輯和窗代替骨料:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM