below is the given table in DB
| ID | org_id | app_code | year |
|---|---|---|---|
| 1 | 205 | EBB | 2016 |
| 2 | 205 | EBB | 2016 |
| 3 | 205 | LF | 2017 |
| 4 | 205 | LF | 2017 |
| 5 | 205 | LF | 2018 |
| 6 | 205 | LF | 2018 |
| 7 | 205 | LF | 2019 |
| 8 | 205 | LF | 2019 |
| 9 | 205 | EBB | 2020 |
| 10 | 205 | EBB | 2020 |
| 11 | 205 | LF | 2020 |
| 12 | 205 | LF | 2020 |
| 13 | 205 | EBB | 2021 |
| 14 | 205 | EBB | 2021 |
| 15 | 205 | LF | 2021 |
| 16 | 205 | LF | 2021 |
| 17 | 205 | LF | 2022 |
| 18 | 205 | LF | 2022 |
| 19 | 205 | EBB | 2022 |
| 20 | 205 | EBB | 2022 |
expected output is
| ID | org_id | app_code | year | Flag |
|---|---|---|---|---|
| 1 | 205 | EBB | 2016 | 2 |
| 2 | 205 | EBB | 2016 | 2 |
| 3 | 205 | LF | 2017 | 1 |
| 4 | 205 | LF | 2017 | 1 |
| 5 | 205 | LF | 2018 | 1 |
| 6 | 205 | LF | 2018 | 1 |
| 7 | 205 | LF | 2019 | 1 |
| 8 | 205 | LF | 2019 | 1 |
| 9 | 205 | EBB | 2020 | 3 |
| 10 | 205 | EBB | 2020 | 3 |
| 11 | 205 | LF | 2020 | 3 |
| 12 | 205 | LF | 2020 | 3 |
| 13 | 205 | EBB | 2021 | 3 |
| 14 | 205 | EBB | 2021 | 3 |
| 15 | 205 | LF | 2021 | 3 |
| 16 | 205 | LF | 2021 | 3 |
| 17 | 205 | LF | 2022 | 3 |
| 18 | 205 | LF | 2022 | 3 |
| 19 | 205 | EBB | 2022 | 3 |
| 20 | 205 | EBB | 2022 | 3 |
if ALL the app code for a particular year is LF then 1
if ALL the app code for a particular year is EBB the 2
if the app code for a particular year having both LF and EBB the 3.
need help in SQL
CodePudding user response:
To calculate flags for each year and org_id separately you can use following query:
SELECT *,
MAX(CASE WHEN app_code='EBB' THEN 2 ELSE 0 END) OVER (PARTITION BY org_id, year)
MAX(CASE WHEN app_code='LF' THEN 1 ELSE 0 END) OVER (PARTITION BY org_id, year) Flag
FROM T
If version < 8.0 you can use more complex query:
SELECT T.*, F.Flag
FROM T
JOIN (
SELECT org_id, year, CASE WHEN IsEBB=1 AND IsLF=1 THEN 3 WHEN IsEBB=1 THEN 2 ELSE 1 END Flag
FROM (
SELECT org_id, year, MAX(CASE app_code WHEN 'EBB' then 1 END) IsEBB, MAX(CASE app_code WHEN 'LF' then 1 END) IsLF
FROM T
GROUP BY org_id, year
) Group1
) F ON T.org_id=F.org_id AND T.year=F.year
CodePudding user response:
You can do this with CASE.
SELECT
ID
,org_id
,app_code
,year
,CASE WHEN app_code = 'EBB' AND year = 2016 THEN 2
WHEN app_code = 'LF' AND year = 2017 THEN 1
--add other conditions here
END AS Flag
FROM
tbl_name
