2017-02-13 10 views
0

У меня есть таблица, которая содержит информацию для комнат, она содержит, среди прочих, столбец для BLDGCODE, а другой для COSTCODE. Каждой комнате в здании (BLDGCODE) может быть назначен только один кодер стоимости, и все они могут быть одного и того же значения или разных значений.SQL, чтобы найти несколько разных значений

Я пытаюсь написать сценарий, который показывает только здания с более чем одним отдельным кодом стоимости, назначенным его многочисленным комнатам, например, несколько комнат могут иметь код стоимости 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 не будет указывается, поскольку он имеет только один код стоимости

Спасибо

+0

Ваше утверждение о «таблице», похоже, не имеет ничего общего с вашим запросом, который включает в себя множество таблиц. Примеры данных и желаемые результаты помогут уточнить. –

+0

Попробуйте «МЕНЬШЕГО» (costcode) <> MAX (costcode) '(по крайней мере два разных кода стоимости), что более эффективно, чем' HAVING COUNT (DISTINCT costcode)> 1' – dnoeth

+0

Спасибо dnoeth, но оба примера возвращают нулевые значения – FredTheDog

ответ

1

Вам нужны все эти строки с несколькими кодами стоимости, поэтому простая агрегация не работает. Вы можете сделать одну и ту же логику, используя вместо этого другой cte с Windowed Aggregates:

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 
+0

Спасибо, dnoeth, но я не могу заставить это работать, не могли бы вы включить мой упрощенный SQL выше и вставить в свой ответ? – FredTheDog

+0

@FredTheDog: Отредактированный мой ответ, теперь это должно работать. – dnoeth

+0

Работал как шарм, мне нужно лучше понять, как вставлять утверждения CTE. – FredTheDog

 Смежные вопросы

  • Нет связанных вопросов^_^