SQL/Mainframe - SELECT z agregacją i grupowaniem po nowej kolumnie

0

Mam dajmy na to taką tabelę

Id | Co | Czas
1 | 2 | 3
1 | 1 | 5
1 | 2 | 2
1 | 0 | 7
2 | 2 | 4
2 | 2 | 5
2 | 1 | 3
2 0 | 4

Chciałbym zagregować czas dla konkretnych ID:
SELECT Id, Co, SUM(Czas) FROM TABLE GROUP BY Id, Co, Czas

Jednakże chciałbym aby jeśli w kolumnie Co jest 2 lub 1 to ich czasy też sumować a tylko dla 0 sumować oddzielnie

SELECT Id,
CASE WHEN Co='1' THEN 'A'
CASE WHEN Co='2' THEN 'A'
CASE WHEN Co='0' THEN 'B'
ELSE 'C' END AS Grupa,
SUM(Czas) FROM TABLE
GROUP BY Id, Grupa,
I to nie działa. Da się to jakoś prosto to zrealizować?

0

nie działa bo jest błąd, donyślam się że w składni 'case'

powinno być coś w rodzaju
CASE WHEN co='1' THEN 'A'
WHEN co='2' THEN 'A'
...
ELSE 'C' END.

0

Case musi byc w osobnym podzapytaniu.
A tak dla przyzwoitosci to napisz jaki mainframe i jaki dbms bo można sie tylko domyślać ze IBM DB2.

1

Nie podałeś dokładnie bazy więc przygotowałem Ci to na postgresql (bo taki mam pod ręką)

select s.id, s.new_dens, sum(s.czas) 
  from (
  select c.id, c.dens, case when c.dens = 1 then 1 else 2 END new_dens, c.czas
  	      from (select t.id, t.co, dense_rank() over (order by t.co) dens, t.czas
                  from test.test t) c
                  ) s                
group by s.id, s.new_dens

Może da się to uprościć ale nie chciało mi się kombinować :)

1

w mssql powinno zadziałać coś w rodzaju:

SELECT sum(czas), Id, case Co when '1' then 'A' when '2' then 'B' end
group by id, case Co when '1' then 'A' when '2' then 'B' end

1 użytkowników online, w tym zalogowanych: 0, gości: 1