2017-02-13 3 views
0

Ich habe eine Tabelle, die Informationen für Räume enthält, es enthält unter anderem eine Spalte für BLDGCODE und eine andere für COSTCODE. Jedem Raum im Gebäude (BLDGCODE) kann nur ein einziger Kostencode zugeordnet werden, und alle können denselben Wert oder unterschiedliche Werte haben.SQL, um verschiedene Werte zu finden

Ich versuche, ein Skript zu schreiben, das nur Gebäude mit mehr als einem eindeutigen Kostencode für seine vielen Räume anzeigt, zum Beispiel könnten mehrere Räume den Kostencode ABC und andere 999 haben, was ich identifizieren und berichten möchte. Ich habe versucht mit dem untenstehenden Gedanken ein CTE würde mir die Ergebnisse bringen, aber ich sehe immer noch Gebäude mit nur dem einen Kostencode, die für mehrere Räume im Gebäude wiederholt werden.

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 

Wie entferne ich jene Gebäude, die mehrere Vorkommen der Kostencode ist gleich, und nur zeigen diejenigen, obwohl sie die mehr als ein Kostencode haben, innerhalb derer unterschiedlich sind?

So, hier ist der Code eine einzelne Tabelle verweisen:

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 

Beispiel Datensatz wäre:

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 

Erwartete Ergebnisse wäre:

BLDGCODE  COSTCODE  AREA 
01   AA-01  10 
01   AS-05  20 
01   XY-99  100 

BLDGCODE 02 würde nicht angezeigt werden, da es nur einen einzigen Kostencode

hat 0

Danke

+0

Ihre Aussage über "eine Tabelle" scheint nichts mit Ihrer Abfrage zu tun, die viele Tabellen umfasst. Beispieldaten und gewünschte Ergebnisse würden zur Klärung beitragen. –

+0

Versuchen Sie 'HAVING MIN (Kostencode) <> MAX (Kostencode)' (mindestens zwei verschiedene Kostencodes), die effizienter ist als 'HAVING COUNT (DISTINCT-Kostencode)> 1' – dnoeth

+0

Danke dnoeth, aber beide Beispiele geben Nullwerte – FredTheDog

Antwort

1

Sie möchten alle diese Zeilen mit mehreren Kostencodes, so dass eine einfache Aggregation nicht funktioniert. Sie können die gleiche Logik mit einer anderen Cte mit Windowed Aggregates stattdessen:

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

Dank dnoeth, aber ich kann nicht scheinen, dass das funktioniert, würde es Ihnen etwas ausmachen, meine vereinfachte SQL oben und eingebettet in Ihre Antwort? – FredTheDog

+0

@FredTheDog: Bearbeitete meine Antwort, das sollte jetzt funktionieren. – dnoeth

+0

Arbeitete wie ein Zauber, ich muss besser verstehen, wie man CTE-Anweisungen verschachtelt. – FredTheDog

Verwandte Themen